1

我有一个 Tag 类,它通过与一堆其他类相关联,has_and_belongs_to_many并且正在寻找一种简单的方法来仅返回“正在使用”的标签集合。

我正在尝试scope如下

class Tag < ActiveRecord::Base

  validates_presence_of :name
  validates_uniqueness_of :name

  has_and_belongs_to_many :users
  has_and_belongs_to_many :widgets

  # it's in_use if users.count > 0 || widgets.count > 0
  scope :in_use, joins(:users).where('users.count > 0').merge(joins(:widgets).where("widgets.count > 0"))
end

但是我收到此错误-SQLException: no such column: users.count

如何最好地实现我想要的 oucome,以便我可以通过 获取所有正在使用的标签Tag.in_use

4

2 回答 2

1

我不知道如何使用 activerecord 助手来做到这一点。但是您可以使用原始 sql 来执行此操作。如果您的连接表被称为tags_usersand tags_widgets,那么这样的事情将起作用:

scope :in_use, find_by_sql('select * from tags 
    inner join tags_users on tags.id = tags_users.tag_id 
    inner join users on tags_users.user_id = users.id 
    union select * from tags 
    inner join tags_widgets on tags.id = tags_widgets.tag_id 
    inner join widgets on tags_widgets.widget_id = widgets.id')
于 2012-09-01T07:24:01.903 回答
0

我最终解决了这个问题,如下所示。

class Tag < ActiveRecord::Base

  validates_presence_of :name
  validates_uniqueness_of :name

  has_and_belongs_to_many :users
  has_and_belongs_to_many :widgets

  def self.in_use
    return find_by_sql('select tags.* from tags 
      inner join tags_users on tags.id = tags_users.tag_id 
      inner join users on tags_users.user_id = users.id 
      union select tags.* from tags 
      inner join tags_widgets on tags.id = tags_widgets.tag_id 
      inner join widgets on tags_widgets.widget_id = widgets.id')
  end

end

因为将find_by_sql子句放入命名scope实际上不起作用(请参阅对戈登威尔逊回答的评论)。

于 2012-09-02T02:54:08.687 回答