Ruby / Rails - 是一个"事件"我的用户模型上的方法这么糟糕吗?

时间:2014-12-27 08:39:28

标签: ruby-on-rails ruby rolify

我正在开发一个用户参与一个或多个活动的应用程序,因此可以说"有"基于他们在这些事件中占据的角色的事件。我使用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. 此方法需要多次数据库调用才能最终获取事件 - 一个用于角色,另一个用于事件。 (我对这类事情缺乏经验,所以我不确定它到底有多糟糕。)
  3. 在保持我的Rolify角色设置的同时,是否有更好的方法来获取用户的活动?

1 个答案:

答案 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.