我是rails的新手,我正在尝试将默认歌曲与主题相关联。问题是,如果我给主题一个default_song_id属性,我只能通过调用default_song直接访问该歌曲,如果我让主题属于该歌曲。
我的问题基本上只是关联的名称。主题显然不属于我的模型层次结构中的歌曲,而且歌曲已经有太多属性。给歌曲一个theme_id属性是没有意义的,因为歌曲涉及许多其他关系,它实际上只是关注特定歌曲的主题,加上一首歌可以被多个主题引用。
我还有其他选择吗?
答案 0 :(得分:1)
听起来似乎'has_many:through'关联可能正是您正在寻找的。这里有一个很好的贯穿:http://guides.rubyonrails.org/association_basics.html。
基本上,您将要设置一个中间模型来加入您的歌曲和主题模型,而不会明确属于另一个。假设你创建一个“Assignment”模型来处理这个问题,你的模型会说:
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进行分配,这样您就可以随时查询Assignments表,其中theme_id / song_id = x可以检索相关记录。希望这种方法足够灵活,可以做你想做的事情。
答案 1 :(得分:0)
关于使用其他名称进行关联定义:否。
Rails是一个固定的框架,按设计 - convention over configuration。 belongs_to
是其设计者在DSL模型/关联描述中为此概念选择的关键字,您应该尝试习惯使用它。请记住,您所写的内容仍然是代码;只是因为很多Ruby / Rails读起来像英语,这并不意味着是英语,并且关键词并不总是与它们看起来的英文单词具有相同的含义。
别名belongs_to
和其他关联宏theoretically possible,但你真的不应该这样做。如果其他人不得不使用它,将会损害您的代码的可读性。