假设我有一对模型:
class Club < ActiveRecord:Base
has_many :members, autosave: true
end
class Member < ActiveRecord:Base
belongs_to :club
end
我希望能够在不保留新成员的情况下向俱乐部添加一些新成员,直到我保存俱乐部。我怎么能这样做?
使用<<
将会员添加到俱乐部不能按我的意愿工作,因为这会自动保存会员。
假设我有一对模型:
class Club < ActiveRecord:Base
has_many :members, autosave: true
end
class Member < ActiveRecord:Base
belongs_to :club
end
我希望能够在不保留新成员的情况下向俱乐部添加一些新成员,直到我保存俱乐部。我怎么能这样做?
使用<<
将会员添加到俱乐部不能按我的意愿工作,因为这会自动保存会员。
根据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
为成员模型创建一个名为“temporar_id”的属性。
成员以带有俱乐部 id 的临时 ID 开头,但尚未与俱乐部关联。
club_id
是nil
直到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
那这个呢
def add_members
@club = Club.find(params[:id])
@members = #From_where_ever_you_want
@members.each do |member|
@club << member
end
end
直到你打电话
@club.save
新成员只存储在内存中。