我正在开发一个用户参与一个或多个活动的应用程序,因此可以说"有"基于他们在这些事件中占据的角色的事件。我使用Rolify将用户与事件相关联。 Rolify根据用户在事件中占据的角色形成用户与事件之间的关联。 Rolify更关心的是返回有关用户角色的数据,但并不关心用户具有该角色的事件,因此不会返回有关该事件的数据(除了其ID)
所以,我可以写一个像这样的方法:
@user.roles
并获取与用户关联的所有角色。
其中一个角色如下:
=> #<Role id: 1, name: "admin", resource_id: 1, resource_type: "Event", created_at: "2014-12-19 04:00:33", updated_at: "2014-12-19 04:00:33">
我想要做的是说
@user.events(roleName)
并获取与roleName相关联的所有事件。
显然,我不能只通过Rolify可以提供给我的东西,所以我在我的用户模型上创建了一个方法来帮助:
def events roleName=nil
events_list = []
self.roles.each do |role|
unless roleName.nil?
if role.name == roleName && role.resource_type == "Event"
events_list.push(role.resource_id)
end
else
events_list.push(role.resource_id)
end
end
Event.find(events_list)
end
我担心的是
在保持我的Rolify角色设置的同时,是否有更好的方法来获取用户的活动?
答案 0 :(得分:1)
是的,当你在Rails中有以下可能性时,这是一个坏主意:
在您的用户模型中添加:
has_many :events, through: :roles, source: :resource, source_type: 'Event'
这样user.events
将返回所有用户的事件。对于特定角色的事件,您可以:
user.events.where(roles: {name: role_name})
Lastly, a suggestion: don't use camel-case names for methods, variables, or symbols.