に変換:私の写真のモデルではのActiveRecordのHABTMのクエリは、私はかなり一般的<code>habtm</code>関係していAREL
Photo has_and_belongs_to_many :tags
Tag has_and_belongs_to_many :photos
を私がでタグ付けされた写真を見つけるために使用「のタグで」メソッドを持っています指定されたtag_idのセットこのクエリは、指定されたすべてのタグを持つ写真だけを照合する必要がありますが、他のタグの有無は無視してください。ここに私の方法です:
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)
しかし、(1)私はq
が最初の場所で右のクエリであるとは思わない、と(2)それが渡されたArel::SelectManager
を作成しますどこに呼び出しが発生するかCannot visit Arel::SelectManager
。だから、明らかに私はこれを間違っている。
更新:Arelノードを検索メソッドに渡すことを期待している宝石(ransack)で作業しているので、私はArelノードを返すようにしています。 Ransackは、このArelノードを複雑な検索クエリを生成する際に他のノードと連鎖させます。
私はどのようにこれを正しく行うことができますか?
これは答えではありませんが、Squeelを試してみてください!ARのデフォルトはかなり不自然ですが、ARELははるかに強力ですが、悲惨なことに文書化されています。このようなことをするには、豪華な宝石がとてもいいです! –