7

假设我有一对模型:

class Club < ActiveRecord:Base
  has_many :members, autosave: true
end

class Member < ActiveRecord:Base
  belongs_to :club
end

我希望能够在不保留新成员的情况下向俱乐部添加一些新成员,直到我保存俱乐部。我怎么能这样做?

使用<<将会员添加到俱乐部不能按我的意愿工作,因为这会自动保存会员。

4

3 回答 3

3

根据has_many 文档,“铲子”方法collection<<(object, …)

通过将对象的外键设置为集合的主键,将一个或多个对象添加到集合中。请注意,此操作会立即触发更新 SQL,而无需等待父对象上的保存或更新调用,除非父对象是新记录。

如果您想构建一个新记录而不将其保存到数据库中,请使用collection.build.

返回集合类型的一个或多个新对象,这些对象已使用属性实例化并通过外键链接到此对象,但尚未保存。

使用 Club 和 Member 作为示例模型:

club = Club.find(params[:id])
club.members.build(member_attributes) # member is not saved
club.save # saves club and members
于 2016-01-26T22:29:33.220 回答
0

为成员模型创建一个名为“temporar_id”的属性。

成员以带有俱乐部 id 的临时 ID 开头,但尚未与俱乐部关联。

club_idnil直到accept_members运行。

class Club < ActiveRecord:Base
  has_many :members, autosave: true

  # Accepts all new member, just as an example
  # Used like this in controller
  # @club = Club.find(params[:id])
  # @club.accept_members
  def accept_members
    User.find_all_by_temporary(true).each do |new_member|
      new_member.tempoary = false
      new_member.club_id = id 
    end
  end
end

class Member < ActiveRecord:Base
  belongs_to :temporary
  belongs_to :club
end
于 2012-10-15T19:24:38.883 回答
-1

那这个呢

def add_members
  @club = Club.find(params[:id])
  @members = #From_where_ever_you_want
  @members.each do |member|
  @club << member
end
end

直到你打电话

@club.save

新成员只存储在内存中。

于 2012-10-15T18:32:49.647 回答