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

Lui*_*igi 25 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.

sco*_*ttb 46

这也有效:

GroupMember.where(member_id: 4).first_or_initialize(group_id: 7)
Run Code Online (Sandbox Code Playgroud)

传递给first_or_initialize的属性仅在创建新记录时使用,并且它们与"where"子句中的属性合并.

  • IMO这应该是公认的答案. (3认同)

Nik*_*nov 40

这是我使用的参考 - http://apidock.com/rails/ActiveRecord/Relation/first_or_initialize

该方法的来源说明:

def first_or_initialize(attributes = nil, &block)
  first || new(attributes, &block)
end
Run Code Online (Sandbox Code Playgroud)

因此,如果找不到记录 - 它会初始化一个新记录并传递给一个块.

你可以用它:

GroupMember.where(:member_id => 4).first_or_initialize do |member|
  member.group_id = 7
end
Run Code Online (Sandbox Code Playgroud)

它只会执行新记录块.