如何在Rails模型中有条件地定义方法

时间:2015-11-19 18:45:34

标签: ruby-on-rails ruby metaprogramming

我有一个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

但我认为情况并不好。

0 个答案:

没有答案