0

我正在开发一个应用程序,其中用户参与一个或多个事件,因此可以根据他们在这些事件中占据的角色说“拥有”事件。我正在使用 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

我担心的是

  1. 这种方法在某种程度上违反了单一责任原则。
  2. 此方法需要多次数据库调用才能最终获取事件——一个到角色,另一个到事件。(我对这种事情没有经验,所以我不确定它到底有多糟糕。)

在保持我的 Rolify 角色设置的同时,有没有更好的方法来获取用户的事件?

4

1 回答 1

1

是的,当您在 Rails 中有以下可能性时,这是一个坏主意:

在你的用户模型中添加这个:

has_many :events, through: :roles, source: :resource, source_type: 'Event'

这种方式user.events将返回所有用户的事件。对于特定角色的事件,您可以:

user.events.where(roles: {name: role_name})

最后,一个建议:不要对方法、变量或符号使用驼峰式名称。

于 2014-12-27T09:27:17.813 回答