通过许多模型联系

时间:2012-10-14 17:25:56

标签: ruby-on-rails ruby ruby-on-rails-3

我有以下型号:

class Song < ActiveRecord::Base

  belongs_to :albums

end

class Album < ActiveRecord::Base

  belongs_to :artist
  has_many :songs

end

class Artist < ActiveRecord::Base

  belongs_to :user
  has_many :albums

end

我需要定期确定特定歌曲属于哪个用户。在Song模型中添加belongs_to:user关系或每次调用song.album.artist.user是更好的形式吗?

1 个答案:

答案 0 :(得分:1)

您似乎违反了Law of Demeter。考虑使用delegate

class Song < ActiveRecord::Base

  belongs_to :albums
  delegate :user, :to => :album

end

class Album < ActiveRecord::Base

  belongs_to :artist
  has_many :songs
  delegate :user, :to => :artist

end

class Artist < ActiveRecord::Base

  belongs_to :user
  has_many :albums

end

使用此方法,您现在可以调用song.user

此处的另一个好处是,如果模型的结构发生变化(可能会发生变化),您可以重新定义或重新委托Song#user到其他东西,以便依赖于调用{{1}的对象1}}不会破坏。

资源