我是新手,我試圖將默認歌曲與主題相關聯。問題是如果我給主題一個default_song_id屬性,我只能通過調用default_song直接訪問歌曲,如果我將主題屬於歌曲。是否有像belongs_to一樣的不同關聯?
我的問題基本上只是該協會的名稱。這個主題顯然不屬於我的模型層次結構中的歌曲,而且這些歌曲的屬性已經太多了。給歌曲添加一個theme_id屬性是沒有意義的,因爲歌曲涉及到很多其他關係,它只是關注特定歌曲的主題,另外一首歌曲可以被多個主題引用。
那麼我還有其他的選擇嗎?
我是新手,我試圖將默認歌曲與主題相關聯。問題是如果我給主題一個default_song_id屬性,我只能通過調用default_song直接訪問歌曲,如果我將主題屬於歌曲。是否有像belongs_to一樣的不同關聯?
我的問題基本上只是該協會的名稱。這個主題顯然不屬於我的模型層次結構中的歌曲,而且這些歌曲的屬性已經太多了。給歌曲添加一個theme_id屬性是沒有意義的,因爲歌曲涉及到很多其他關係,它只是關注特定歌曲的主題,另外一首歌曲可以被多個主題引用。
那麼我還有其他的選擇嗎?
這聽起來好像'has_many:through'關聯可能是你要找的。這裏有一個很好的轉場:http://guides.rubyonrails.org/association_basics.html。
本質上,您將要建立一箇中介模型來加入您的歌曲和主題模型,而不會使其明確屬於另一個模型。假設您創建一個「分配」的模式來處理這個,你的模型會說:
class Song < ActiveRecord::Base
has_many :assignments
has_many :themes, through: :assignments
end
class Theme < ActiveRecord::Base
has_many :assignments
has_many :songs, through: :assignments
end
class Assignment < ActiveRecord::Base
belongs_to :song
belongs_to :theme
end
對於每個配對,那麼你有一個theme_id的分配和song_id讓您可以隨時查詢分配表,其中theme_id/song_id = x來檢索關聯的記錄。希望這種方法足夠靈活,可以做你想做的事情。
由於使用另一個名稱爲關聯定義的擔憂:第
Rails是一個堅持己見的框架,通過設計 - convention over configuration。 belongs_to
是其設計人員在模型/關聯描述的DSL中爲此概念選擇的關鍵字,您應該嘗試習慣使用它。請記住,你正在編寫的內容仍然是代碼;僅僅因爲很多Ruby/Rails像英文那樣讀取,並不意味着它是英文,並且關鍵字並不總是與它們的英文單詞具有相同的含義。
它是theoretically possible到別名belongs_to
和其他關聯宏,但你真的不應該。如果其他人必須使用它,它會損害您的代碼的可讀性。
有道理!既然它感覺如此接近英語,每當我遇到這樣的問題時,我不禁想到可能有更好的紅寶石方式。我猜想沒有什麼是完美的。 – DogNibbler
雖然我喜歡這個想法,但如果我將其應用於整個應用程序,它可能會簡化一些事情,但我現在仍想避免使用中間人。如果沒有人回答有效的答案,我會將其標記爲這樣。 – DogNibbler
如果你喜歡這個多對多的方面,但想避免中間模型,請查看'has_and_belongs_to_many'。 http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_and_belongs_to_many – MrTheWalrus