Rails, где () предложение по ассоциации моделей? - PullRequest
42 голосов
/ 13 июня 2011

Предположим, у меня есть модель Аккаунта, которая имеет Users_many. Учетные записи имеют логический «активный» столбец. Как я могу получить всех пользователей, которые принадлежат к «активным» учетным записям?

@users_of_active_accounts = User.?

Спасибо! * * 1004

Ответы [ 3 ]

80 голосов
/ 13 июня 2011

Попробуйте это:

User.joins(:account).where(:accounts => { :active => true })
50 голосов
/ 13 июня 2011

Вам необходимо присоединиться к таблице счетов и объединить соответствующие области счетов:

User.joins(:account).merge(Account.where(:active => true))
10 голосов
/ 20 июля 2016

Используйте условие where в ассоциации модели Account:

class Account < ActiveRecord::Base
  has_many :users, -> {where(active: true)}

Другие запросы будут работать, но если вы всегда заботитесь только об активных пользователях, фильтрация на уровне ассоциации будет правильно инкапсулировать фильтр и сохранитьу вас головные боли в будущем.

Обновление:

Вы также можете указать 2 отношения в одной таблице:

 class Account < ActiveRecord::Base
   has_many :users
   has_many :active_users, -> {where(active: true)}, :class_name => 'User'

2-е обновление:

После повторного чтения вопроса,Теперь я вижу, что мой ответ не ответил на вопрос.Вот мой ответ на вопрос:

User.where(account: Account.where(active: true))

3-е обновление: вот пример модели пользователя, имеющей атрибут active_users

class User < ActiveRecord::Base
  belongs_to :account
  def self.active
    where(account: Account.where(active: true))
  end
end

Делая это таким образом, вы можете поместить его в линию с другимизапросы пользователей:

User.active.where(created_at: (1.week.ago..0.day.ago)).count
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...