我已经研究过如何做到这一点,我找到的最好的资源是http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html
特别是在该页面上,它说:
member = Member.create(params[:member])
member.posts.length # => 2
member.posts.first.title # => 'Kari, the awesome Ruby documentation browser!'
member.posts.second.title # => 'The egalitarian assumption of the modern citizen'
我正在尝试遍历我的嵌套属性,并为嵌套在事件模型中的每个场景创建一个新的Entry对象,但是如何使用.first和.second ...等等迭代。
因此,这里的所有目标都是拥有一个复杂的表单,在创建事件时,您可以使用嵌套属性在该事件中创建许多场景。创建或更新场景或事件时,需要触发并创建与事件ID绑定的新日志条目。除此之外,我还需要在将资产分配给场景并将scene_role分配给资源时触发回调。
通过几个小时的研究,我无法弄清楚除了使用.first和.second之外如何迭代嵌套属性。
这是我的事件模型:
class Incident < ActiveRecord::Base
has_many :scenes
has_many :scene_assignments
has_many :entries
after_create :create_action
after_update :update_action
accepts_nested_attributes_for :scenes
accepts_nested_attributes_for :scene_assignments
def create_action
@entry = Entry.new(incident_id: self.id, name: "Created Incident - #{self.name}")
@entry.save
self.scenes.each do
@scene_entry = Entry.new(incident_id: self.id, name: "#{self.scenes.first.name} was created")
@scene_entry.save
end
end
def update_action
@entry = Entry.new(incident_id: self.id, name: "Updated Incident - #{self.name}")
@entry.save
end
end
目前的工作原理是:它将使用事件名称为事件创建日志条目。我还在表格中填写了2个场景。因此,它将为条目表中的那些场景创建2个条目,其中事件ID正确地将条目绑定到事件。但是,它只会打印日志条目中第一个场景的名称。
另外,我知道调用列名称是违反直觉的:对于日志条目,但是在该字段中存储条目的位置。
所以数据库表看起来像
ID | NAME | INCIDENT_ID and the records look like:
1 | Incident Name | 50
2 | Scene 1 Name | 50
3 | Scene 1 Name | 50
答案 0 :(得分:1)
如果要迭代模型的嵌套属性,只需使用普通的Ruby循环:
member.posts.each do |post|
...
end
您可以使用循环中的post
变量做任何您喜欢的事情 - 更新,保存,销毁等。