在活动记录中有一个方便的动态属性,称为 find_or_create_by:
Model.find_or_create_by_<attribute>(:<attribute> => "")
但是如果我需要通过多个属性来查找或创建呢?
假设我有一个模型来处理 Group 和 Member 之间的 M:M 关系,称为 GroupMember。我可以有很多 member_id = 4 的实例,但我不想多次遇到 member_id = 4 和 group_id = 7 的实例。我试图弄清楚是否可以做这样的事情:
GroupMember.find_or_create(:member_id => 4, :group_id => 7)
我意识到可能有更好的方法来处理这个问题,但我喜欢 find_or_create 想法的便利性。
多个属性可以用一个连接and:
and
GroupMember.find_or_create_by_member_id_and_group_id(4, 7)
(find_or_initialize_by如果您不想立即保存记录,请使用)
find_or_initialize_by
编辑: 上述方法在 Rails 4 中已弃用。新的方法是:
GroupMember.where(:member_id => 4, :group_id => 7).first_or_create
和
GroupMember.where(:member_id => 4, :group_id => 7).first_or_initialize
编辑2: 并非所有这些都被排除在rails之外,只是属性特定的那些。
https://github.com/rails/rails/blob/4-2-stable/guides/source/active_record_querying.md
例子
变成了
GroupMember.find_or_create_by(member_id: 4, group_id: 7)