私はかなり一般的なhabtm
関係を持っています:
Photo has_and_belongs_to_many :tags
Tag has_and_belongs_to_many :photos
私の写真モデルには、特定の一連の tag_ids でタグ付けされた写真を見つけるために使用する「タグ付き」メソッドがあります。このクエリは、指定されたすべてのタグを持つ写真のみに一致する必要がありますが、他のタグの有無は無視します。これが私の方法です:
def self.with_terms( array )
select('distinct photos.*').joins(:tags).where('tags.id' => array).group("photos." + self.column_names.join(', photos.')).having("count(*) = #{array.size}")
end
これは期待どおりに機能します。
さて、これを私が使用している他のライブラリとよりよく統合するために、これを Arel で書き直す必要があります。(Arel ノードにしますか?、これを通常何と呼ぶかはわかりません)。
私はこれを試してきましたが、正直なところ、Arel を使用したことがないので、少し迷っています。私はコンソールで実験していて、試しました:
t = Photo.arel_table
q = t.join(:tags).on(t[:tags_id].in(array))
Photo.where(q)
q
しかし、(1) はそもそも正しいクエリではないと思います。(2) を作成しArel::SelectManager
、それが where 呼び出しに渡されると が発生しCannot visit Arel::SelectManager
ます。だから、明らかに私はこれを間違っています。
更新: ここでさらに具体的に言うと、Arel ノードを返すことを検討しています。これは、検索メソッドに Arel ノードを渡すことを期待する gem (ランサック) を使用しているためです。Ransack は、複雑な検索クエリを生成する際に、この Arel ノードを他のノードと連鎖させます。
Arel の第一人者がこれを正しく行う方法を教えてくれませんか?