我是 Rails 新手,我正在尝试将默认歌曲与主题相关联。问题是如果我给主题一个 default_song_id 属性,我只能通过调用 default_song 直接访问这首歌,如果我让主题属于歌曲。
我的问题基本上只是协会的名称。主题显然不属于我的模型层次中的歌曲,歌曲的属性已经太多了。给歌曲一个 theme_id 属性是没有意义的,因为歌曲涉及到很多其他的关系,它实际上只是关心一首特定歌曲的主题,而且一首歌曲可以被多个主题引用。
那么我还有其他选择吗?
我是 Rails 新手,我正在尝试将默认歌曲与主题相关联。问题是如果我给主题一个 default_song_id 属性,我只能通过调用 default_song 直接访问这首歌,如果我让主题属于歌曲。
我的问题基本上只是协会的名称。主题显然不属于我的模型层次中的歌曲,歌曲的属性已经太多了。给歌曲一个 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 是一个固执己见的框架,按照设计约定优于配置。是其设计者在模型/关联描述的DSLbelongs_to
中为此概念选择的关键字,您应该尝试习惯使用它。请记住,您正在编写的仍然是代码;仅仅因为很多 Ruby/Rails 读起来像英语,这并不意味着它是英语,而且关键字并不总是与它们看起来的英语单词具有相同的含义。
理论上可以别名belongs_to
和其他关联宏,但你真的不应该。如果其他人不得不使用它,它将损害您代码的可读性。