2011-05-16 60 views
1

使用Cancan,我需要检查用户角色。与用户 - > userroles(引用ID) - >角色(每个角色的名称,角色位于名称列中)具有has_many关系。在多关系中检查角色

在我的用户模型中,我有一个函数:角色?(角色),即role?(:admin),用于检查用户是否有角色。我不得不指定名称列吗?

解决:我会在时间过去后将答案放下。

回答

2

你比较字符串对象

def role?(role) 
    !roles.first(:conditions => {:name => role.to_s}).nil? 
end 

试试这个?基于德米特里Likhten的回答

替代

def role?(role) 
    roles.collect{|r| r.name }.include? role.to_s 
end 
1

你可以随时将其过滤在线...

roles.select(&:to_s).include?(role.to_s) 

矿和吉米的方法之间的区别取决于是否将角色已经在内存中。如果是这样,过滤更快,如果不是查询更好。

+0

你不应该使用'collect'而不是'select'吗? 'select'只会返回对象,'collect'会返回一串字符串。你还假设角色对象上的'.to_s'方法返回它的名字,它可能不会 – Jimmy 2011-05-16 18:10:03