Ruby中的动态委派

时间:2016-10-29 08:00:20

标签: ruby-on-rails ruby ruby-on-rails-4

我们有两个类 - 用户和组

class User < ActiveRecord::Base
  # Group Memberships
  has_many :memberships, dependent: :destroy
  has_many :groups, through: :memberships
end

class Group < ActiveRecord::Base
  # Group has a property called 'name'
  # Group members
  has_many :memberships, dependent: :destroy
  has_many :members, through: :memberships, source: :user
end

这很好用,我们可以创建组并将用户添加到这些组。

检测用户群组成员资格的最简洁方法是什么?像:user.reviewer?其中reviewer是组的名称,没有明确定义这些方法。如何使用委托来完成?

我们已经有了它的工作,尽管是一种丑陋的方式。会欣赏最优雅(也是最短)的解决方案。

PS:我们依赖于Rails 4.2.7

2 个答案:

答案 0 :(得分:1)

上次查看delegatehas_many关系不受支持。

最简单的方法是定义member_of?方法。我在这里使用私有方法并使用记忆的组名列表。

class User < ActiveRecord::Base
  # Group Memberships
  has_many :memberships, dependent: :destroy
  has_many :groups, through: :memberships
  delegate :name to :groups

  def member_of?(group_name)
    group_names.include? group_name.to_s
  end

  private

  def group_names
    @group_names ||= groups.pluck(:name)
  end

end

像......一样使用它。

my_user.member_of?(:reviewers)

如果您以单数形式保留组名,您仍然可以进行更具可读性的复数呼叫...

 my_user.member_of?(:reviewers)

只需在方法中将参数引用为group_name.to_s.singularize

请注意,您可以通过添加my_user.reviewer?来支持def method_missing,但您必须这样做 检查该方法是否为有效的组名,然后检查该用户是否是该组的成员,否则将丢失的方法错误(即super)提升为继承的method_missing)。有关如何使用method_missing的简单说明,请参见此处。 https://rosettacode.org/wiki/Respond_to_an_unknown_method_call#Ruby

答案 1 :(得分:0)

这是一种让df(0)能够正常工作的方法...将以下内容添加到您的User类中:

my_user.reviewer?