【问题标题】:Create instance of Rails model with has_many association prepopulated使用预填充的 has_many 关联创建 Rails 模型实例
【发布时间】:2010-07-05 16:36:36
【问题描述】:

这最好通过例子来解释。以下操作很简单:

class Foo < ActiveRecord::Base
  has_many :bars
end

1a>> foo = Foo.new
=> #<Foo id: nil>
2a>> foo.bars << Bar.new
=> [#<Bar id: nil, foo_id: nil>]
3a>> foo.bars
=> [#<Bar id: nil, foo_id: nil>]

但是,我希望所有 Foo 对象都使用 Bar 进行初始化,而不必显式运行第 2 行:

class Foo < ActiveRecord::Base
  has_many :bars

  # [...] Some code here
end

1b>> foo = Foo.new
=> #<Foo id: nil>
2b>> foo.bars
=> [#<Bar id: nil, foo_id: nil>]

这可能吗?理想情况下,“默认”对象仍将以与我明确运行第 2a 行相同的方式关联,以便在保存父 Foo 对象时保存它。

【问题讨论】:

    标签: ruby-on-rails activerecord has-many


    【解决方案1】:

    让我先说从设计的角度来看,这可能不是最好的想法。假设你的代码比 Foo 和 Bar 复杂得多,你可能会朝着更接近builder. 的方向前进

    但是,如果你坚持按照你的要求去做,这会做到的。

    class Foo < ActiveRecord::Base
      has_many :bars
    
      def after_initialize 
        self.bars << Bar.new if self.new_record?
      end 
    end
    

    【讨论】:

      【解决方案2】:

      从概念上讲,这不是执行此类操作的最干净方法,因为您将模型逻辑混合到另一个模型逻辑中。

      还有更多:初始化期间你还没有任何实例,所以我认为这是不可能的。

      请记住,如果您需要保存关联对象,可以在控制器中或使用嵌套模型表单来完成

      你需要完成什么任务?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-19
        • 1970-01-01
        相关资源
        最近更新 更多