我正在开发一个应用程序,其中用户参与一个或多个事件,因此可以根据他们在这些事件中占据的角色说“拥有”事件。我正在使用 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 角色设置的同时,有没有更好的方法来获取用户的事件?