我有以下型号:
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方法相同的方式使用它?
答案 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}}