2017-03-05 33 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

當然,總是一種享受。 –

相關問題