将对象添加到关联集合而不保存

时间:2012-10-15 18:18:19

标签: ruby-on-rails

假设我有一对模型:

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

class Member < ActiveRecord:Base
  belongs_to :club
end

我希望能够增加一些新成员加入俱乐部,而不是坚持新成员,直到我拯救俱乐部。我怎么能这样做?

使用<<向俱乐部添加会员无法正常运作,因为这会自动保存会员。

3 个答案:

答案 0 :(得分:0)

这个怎么样?

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

直到你打电话

@club.save

新成员只存储在内存中。

答案 1 :(得分:0)

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

该成员以具有俱乐部ID的temporary_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

答案 2 :(得分:0)

根据the has_many documentation,“铲”方法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