Rails, ActiveRecord: как мне получить результаты ассоциации плюс некоторые условия? - PullRequest
1 голос
/ 20 августа 2009

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

has_many :groups_users
has_many :users, :through=> :groups_users

Я хотел бы добавить pending_users, который будет таким же, как ассоциация пользователей, но содержит некоторые условия. Я хочу установить его как ассоциацию, чтобы все условия обрабатывались в вызове sql. Я знаю, что есть способ иметь несколько методов доступа для одной и той же модели, даже если имя не связано с тем, какие имена таблиц на самом деле. Это имя_класса?

Любая помощь будет оценена, спасибо

Ответы [ 3 ]

2 голосов
/ 21 августа 2009

Используйте named_scope s, они ваши друзья

Вы пытались использовать named_scope на модели Group?

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

class User < ActiveRecord::Base
  named_scope :pending, :conditions => { :status => 'pending' }

и затем:

a_group.users.pending

Подтверждение

Я запустил следующий код с моим существующим приложением:

Feature.find(6).comments.published

В результате этого запроса (игнорируется первый запрос, чтобы получить функцию 6):

SELECT    * 
FROM      `comments` 
WHERE     (`comments`.feature_id = 6) 
  AND     ((`comments`.`status` = 'published') AND (`comments`.feature_id = 6))
ORDER BY  created_at

А вот соответствующий код модели:

class Feature < ActiveRecord::Base
  has_many    :comments

class Comment < ActiveRecord::Base
  belongs_to  :feature
  named_scope :published, :conditions => { :status => 'published' }
1 голос
/ 21 августа 2009

Это должно быть довольно близко - подробнее о has_many .

has_many :pending_users, 
         :through => :groups_users, 
         :source => :users, 
         :conditions => {:pending => true} 

: ожидание, вероятно, называется чем-то другим, однако вы определяете ожидающих пользователей. Как примечание - обычно, когда вы видите модель пользователя / группы, ассоциация называется членством.

0 голосов
/ 21 августа 2009

В модели User:

named_scope :pending, :include => :groups_users, :conditions => ["group_users.pending = ?", true]

Это если у вас есть столбец bool с именем "pending" в объединительной таблице group_users

Edit: Кстати, с этим вы можете делать такие вещи, как:

Group.find(id).users.pending(:conditions => ["insert_sql_where_clause", arguments])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...