我们有两个类 - 用户和组
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
答案 0 :(得分:1)
上次查看delegate
时has_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?