Rails首先或初始化一个值,但如果创建则添加更多值

时间:2014-01-17 16:01:46

标签: ruby-on-rails ruby-on-rails-4

以下面的例子为例:

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。

4 个答案:

答案 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 )