我有一个Rails应用程序:
class Player < AR
has_many :playlists
belongs_to :master
end
class Playlist < AR
belongs_to :player
belongs_to :master
end
class Master < AR
has_many :players
has_many :playlists
end
当玩家拥有与之关联的主人时,它应该将其播放列表委托给主人。如果没有,它应该使用自己的播放列表。
所以这可以通过简单地覆盖关联方法来解决:
class Player < AR
has_many :playlists
belongs_to :master
def playlists
return super unless master
master.playlists
end
end
但是,假设我说的不仅仅是播放列表,而是一堆不同的收藏类型,我想做的是:
class Player < AR
has_many :playlists
has_many :series
has_many :categories
belongs_to :master
%i(playlists series categories).each do |collection|
if master
define_method collection do
master.send(:collection)
end
end
end
end
所以基本上我只想在实例上存在与master的关联时才覆盖和委托现有的关联。问题当然是代码是在类上定义一个方法,而类没有“主”关联的概念,只有实例才有。有没有办法更优雅地做到这一点?
我可以将检查master的存在的条件放在define_method调用中,如下所示:
%i(playlists series categories).each do |collection|
define_method collection do
return master.send(collection) if master
super()
end
end
但我认为情况并不好。