ActiveRecord :: Relation create vs find_or_create_by

时间:2014-12-02 21:39:39

标签: ruby-on-rails ruby activerecord

我有以下型号:

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

我想创建一个新的模型实例并将其保存到db:

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
)

虽然看起来不太好。

为什么不能以与create方法相同的方式使用它?

1 个答案:

答案 0 :(得分: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 提供的功能。

上面的第二种方法是完成你想要的东西的好方法。如果您非常关注(以及长方法名称),您可以将其包装在以下内容中:

{{1}}