Rails:如何在创建新条目时遍历模型中的嵌套属性

时间:2014-10-02 23:24:38

标签: ruby-on-rails callback nested-attributes

我已经研究过如何做到这一点,我找到的最好的资源是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

1 个答案:

答案 0 :(得分:1)

如果要迭代模型的嵌套属性,只需使用普通的Ruby循环:

member.posts.each do |post|
 ...
end

您可以使用循环中的post变量做任何您喜欢的事情 - 更新,保存,销毁等。