Rails,ActiveRecord:我如何获得关联的结果加上一些条件?

时间:2009-08-20 19:47:46

标签: ruby-on-rails activerecord associations

我有两个模型,用户和组。我还有一个加入表groups_users。 我在群组模型中有一个关联:

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

我想添加pending_users,它们与用户关联相同但包含一些条件。我希望将其设置为关联,以便在sql调用中处理所有条件。我知道有一种方法可以为同一个模型提供多个访问器,即使名称与表名实际上没有关系。是class_name吗?

感谢任何帮助,谢谢

3 个答案:

答案 0 :(得分:2)

使用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 :(得分:1)

这应该非常接近 - 更多关于has_many

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

:pending可能被称为其他东西 - 但是您确定了待处理用户。作为旁注 - 通常当您看到用户/组模型时,该关联称为成员资格。

答案 2 :(得分:0)

在用户模型中:

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

如果你在连接表group_users中有一个名为“pending”的bool列,那就是这样。

编辑: 顺便说一句,你可以这样做:

Group.find(id).users.pending(:conditions => ["insert_sql_where_clause", arguments])