Создание области действия на основе отношения - PullRequest
2 голосов
/ 22 февраля 2011

Я использую Rails 3.0.4 и Ruby 1.9.2

Я пытаюсь создать область действия под названием роль, которая принимает строку роли и возвращает все записи User, которые имеют role как одна из их ролей.

Проблема в том, что User и Role имеют отношения HABTM, и я действительно не знаю, как получить доступ к этой информации в регулярном выражении User.where().

Это то, что я думаю:

scope :role, lamda {|role| where {|user| user.role? role} }

(роль? Это метод, который я написал, который просто проверяет, принадлежит ли пользователь этой роли)

Есть ли способпередать пользовательский объект как то откуда?Или что-то, что выполняет то же самое?

Спасибо.

1 Ответ

3 голосов
/ 22 февраля 2011

Если роль - это просто поле в пользовательской модели:

scope :with_role, lamda{|role_name| where(:role => role_name) }
User.with_role "Member"

Если роль - отдельная модель и User belongs_to :role. Также у роли есть поле заголовка:

scope :with_role, lamda{|role_name| includes(:role).where(:roles => {:title => role_name}) }
User.with_role "Member" # the same usage

UPD 1

Если User has_many :roles, следует использовать метод модели пользователя:

class User < ActiveRecord::Base
  has_many :roles

  def self.with_role(role_name)
    Role.where(:name => role_name).first.users # hope title is validated uniq
  end
end

=> User.with_role ("Пользователь")

или используя область действия:

scope :with_role, lambda{ |role| joins(:roles).where(:roles => {:name => role}) }
...