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

使用中のすべてのタグを経由して取得できるように、希望する結果を達成するにはどうすればよい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は実際には機能しないためです(Gordon Wilsonの回答に関するコメントを参照)。

于 2012-09-02T02:54:08.687 に答える