Как вызвать метод контроллера в модели

У меня есть модель пользователя, которая связана с группами. Отношение приведено ниже

class User < ActiveRecord:;Base
  has_many :groups
end
class Group < ActiveRecord::Base
  belongs_to :user
  scope :user_groups, lambda { where(arel_table(:user_id).eq(@current_user.id) }
end

class ApplicationController < ActionController::Base
  def current_user
    @current_user ||= User.find(session['entity.user']) if session['entity.user']
  end
end

Я хочу фильтровать группы current_user в моем select_tag на странице индекса группы.

Как этого добиться?


person Community    schedule 11.01.2013    source источник


Ответы (2)


Вы не должны обращаться к этим данным внутри модели (это нарушает MVC). Вам было бы лучше передать его в качестве аргумента области видимости:

scope :user_groups, 
           lambda { |user| where(arel_table(:user_id).eq(user.try(:id) || user) }

И назовите это так:

User.user_groups(@current_user) # or you can pass @current_user.id, still works

Примечание. В лямбда-выражение user_groups можно передать идентификатор (целое число) или пользовательский объект.

person MrYoshiji    schedule 11.01.2013
comment
не разрывайте линию между scope :user_groups и lambda [..] - person MrYoshiji; 11.01.2013

Иногда вам может понадобиться проверить current_user в модели. Итак, в текущем пользовательском методе установлено следующее:

 ActiveRecord::Base.current_user = @current_user

Это поможет проверить current_user в любой модели, которую вы определите в будущем.

person Rahul Tapali    schedule 11.01.2013