以下面的例子为例:
GroupMember.where(:member_id => 4).first_or_initialize
如果我想说这样的话怎么办?
如果存在member_id为4的GroupMember,则“找到它”。否则,创建一个GroupMember,其member_id为4,group_id为7。
所以我希望上面的语句只检查member_id - 但是如果它不存在,我希望它创建一个具有多个属性的GroupMember。我该怎么写呢?我正在使用rails 4.0。
答案 0 :(得分:46)
这也有效:
GroupMember.where(member_id: 4).first_or_initialize(group_id: 7)
传递给first_or_initialize的属性仅在创建新记录时使用,并且它们与“where”子句中的属性合并。
答案 1 :(得分:39)
这是我使用的参考 - http://apidock.com/rails/ActiveRecord/Relation/first_or_initialize
该方法的来源陈述:
def first_or_initialize(attributes = nil, &block)
first || new(attributes, &block)
end
因此,如果未找到记录 - 它会初始化一个新记录并传递给一个块。
你可以使用它:
GroupMember.where(:member_id => 4).first_or_initialize do |member|
member.group_id = 7
end
它只会执行新记录的阻止。
答案 2 :(得分:0)
使用
find_or_initialize_by_member_id_and_group_id(member_id, group_id)
您将通过member_id和group id创建GroupMember uniq。 (仅使用一次)
我不确定此声明是否适用于Rails 4。它正在开发Rails 3.2
请在rails控制台上查看上述声明,并告诉我它是否有效。
<强>更新强>
根据错误,控制台代码必须是:
GroupMember.find_or_initialize_by(member_id: member_id, group_id: group_id )
请验证更改是否有效
答案 3 :(得分:0)
尝试使用此Post.find_or_create_by(member_id: member_id, group_id: group_id )