我有以下型号:
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是更好的形式吗?
答案 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}}不会破坏。