2011-07-29 91 views
1

我是Ruby新手,所以請原諒,如果這些是完全無知。我想設置如下關聯:在Rails中設置模型關聯 - 從孫子方保存'

  • 轉錄屬於組成
  • 成分有很多改編,屬於藝術家
  • 藝術家有很多成分(和改編通過組成)

我不不想有任何創作作品和藝術家的獨立形式。用戶只需創建轉錄 - 轉錄的形式具有藝術家和作品的文本字段,數據庫條目應該動態創建(如果它們不存在的話)。

我應該如何設置模型?我應該在轉錄中使用一些虛擬屬性嗎?

# transcription.rb 
def artist_name 
    artist.name if self.artist 
end 

def artist_name=(name) 
    self.artist = Artist.find_or_create_by_name(name) unless name.blank? 
end 

,然後再使用藝術家,我發現或之前創建創建find_or_create_by_name組成?

任何幫助表示讚賞!在此先感謝

回答

1

您不能在轉錄中設置藝術家,因爲藝術家有很多作品而不是轉錄,您需要通過作品訪問藝術家。我希望這段代碼更好地解釋它。

我累了,也許亂七八糟的東西了,但在這裏,我們去(未測試):

# transcription.rb 

attr_writer :composition_name, :artist_name 
before_save :set_artist_and_composition 
validates_presence_of :artist_name, :composition_name 

def composition_name 
    composition.name 
end 

def artist_name 
    composition.artist.name 
end 

def set_artist_and_composition 
    artist = Artist.find_or_create_by_name(@artist_name) 
    self.composition = Composition.find_or_create_by_name(@composition_name) 
    self.composition.artist = artist 
end 
+0

感謝了很多!你的代碼幾乎是完美的,並引導我去做什麼似乎工作。我遇到了attr_reader和我的表單問題(他們在構圖和藝術家未初始化時失敗)。我已經寫了這樣的東西(可以做得更好嗎?)http://pastebin.com/7WvCaDBZ 我也改變了保存到這,因爲我想總是有獨特的藝術家和作曲對:http: //pastebin.com/ZapzvBF5 – chodorowicz

+0

更好的方法是不使用composition_name或artist_name。只需訪問transcription.composition.artist.name和transcription.composition.name。閱讀「嵌套表單」,我相信你會得到一些好的想法。 http://guides.rubyonrails.org/2_3_release_notes.html#nested-object-forms如果在rails中有些東西看起來很尷尬,那麼很可能有更好的方法。 –

+0

再次感謝我的指導。我可能會留下當前的解決方案,因爲幾乎所有嵌套窗體的例子都是當窗體中有子模型的時候。我有相反的方向(belongs_to是主要模型)。我發現了幾個例子,當belongs_to模型是形式的主要模型,但我沒有找到任何與兩級深層關聯的例子,因爲我有。這可能會變得複雜...... – chodorowicz