2017-03-05 34 views
0

所以,我对Rails相当陌生,并且由于模型的复杂性而陷入困境。Rails 5使用父对象通过使用嵌套属性创建多个子对象

我有一个Developer模型,Township模型和Project模式,其内容如下: -

Developer.rb

Class Developer < ApplicationRecord 
    has_many :townships, 
    has_many :projects, through: :townships 

    accepts_nested_attributes_for :township 
end 

Township.rb

Class Township < ApplicationRecord 
    belongs_to :developer 
    has_many :projects 

    accepts_nested_attributes_for :project 
end 

Project.rb

Class Project < ApplicationRecord 
    belongs_to :township 

end 

我想有这样如下创建项目: -

project = Developer.create(
      { 
      name: 'Lodha', 
      township_attributes: [ 
      { 
      name: 'Palava', 
      project_attributes: [ 
       { 
       name: 'Central Park' 
       }, 
       { 
       name: 'Golden Tomorrow' 
       } 
      ]} 
      ]}) 

任何想法,我怎么能做到这一点?我还需要了解DeveloperController中所需的强参数白名单。

+0

是否正确定义了您的关联? – rogelio

+0

从我的理解,他们是。 –

+0

没问题,但关系如下:1)'Developer'是多对多的'Project'或者2''Developer''具有很多'Township'''''''很多'项目' – rogelio

回答

3

我不知道一个方法可以让你在一行创建它(加上它会少可读的),但你可以使用类似的代码轨道下面这样:

def create 
    developer = Developer.new(name: 'Loha') 
    township = developer.townships.build({ name: 'Palava' }) 
    # for this part I don't know what your form looks like or what the 
    # params look like but the idea here is to loop through the project params like so 
    params[:projects].each do |key, value| 
    township.projects.build(name: value) 
    end 

    if developer.save 
    redirect_to #or do something else 
    end 
end 

保存假设你设置了正确的外键,开发人员将使用正确的外键保存所有其他内容。只要注意你的参数的格式,以确保你正确地循环播放它。

+0

感谢您的指导。是的,我很理解你的方法。我仍然相信必须有一种方法来实现这一点,因为映射非常简单和一致。关于模型继承,Rails 5现在自动生成一个名为'ApplicationRecord'的抽象类,它继承了'ActiveRecord :: Base',因此不需要修补来定制或扩展ActiveRecord的功能。 –

+0

真棒,感谢您的更正,我不知道。 – theBrezilien

+0

当然,总是一种享受。 –

相关问题