2014-12-02 93 views
0

我有以下型号:的ActiveRecord ::关系创建VS find_or_create_by

class MyModel < ActiveRecord::Base 

    validates :date, :my_type, presence: true 
    validates_uniqueness_of :my_type, scope: :date 

    enum my_type: { 
    "first_type": 1, 
    "second_type": 2 
    } 

end 

我想创建模型的新实例,并将其保存到数据库:

MyModel.create!(
    date: 1.day.ago, 
    type: :first_type, 
    value: 1.50 
) 

上面的方法让我使用枚举来填充类型,但是我想使用find_or_create_by!方法来确保在重复的情况下不会发生错误。

我想这样做(失败):

myModel = MyModel.find_or_create_by!(
    date: 1.day.ago, 
    type: :first_type, 
    value: 1.50 
) 

我发现我能做到这样:

myModel = MyModel.find_or_create_by!(
    date: 1.day.ago, 
    type: MyModel.my_types[:first_type], 
    value: 1.50 
) 

它看起来并不好,虽然。

为什么不能像创建方法一样使用它?

回答

1

find_or_create_by很简单,首先尝试find_by参数,如果不能,则将它们传递给create

这意味着问题不在create,而是在find_by。在获取/设置模型上的属性时,enum提供的符号/字符串和整数之间的转换发生在find_by不执行的情况下。 find_by根本不知道enum提供的功能。

你上面的第二种方法是一种体面的完成你想要的方法。如果你相当担心(而且方法名称不长),你总是可以用下面的方式包装它:

def self.find_or_create_by_with_my_type(type, hash)  
    find_or_create_by hash.merge(my_type: my_types[type]) 
end