2017-12-16 14 views
-1

ActsAsTaggableOn gemを使用すると、タグ付け可能オブジェクトはテンプレートです。 プラスこれらの関連:Rails/SQLヘルプ:3つのテーブル、別のレコードの存在を選択してソート

class Template 
    acts_as_taggable 
    has_many :template_designs 
end 

class Pins 
    belongs_to :template 
    belongs_to :tag 
end 

class Tags 
    has_many :taggings 
end 

目標:ユーザーがタグを選択した場所をページ分割する準備ができてテンプレート集、我々はそのタグに一致するすべてのテンプレートを見つけ、同じタグテンプレートがピンに存在しているかどうかによって、それらを並べ替えます、上の真実と。

EDIT - 簡略化と言い換え。

テンプレートにタグがタグ付けされていて、それらのタグにピンがある場合とない場合は、Xタグですべてのテンプレートを選択し、そのタグにピンがあるかどうかをソートする必要があります(ブールソート、 )。

+0

親切にあなたの試み、所望の出力を照会し、サンプルデータを共有:

select templates.*, case when exists (select pins.id from pins where pins.tag_id = tags.id and pins.template_id = templates.id) then true else false end as pinned from templates, taggings, tags, pins where templates.id = taggings.template_id and taggings.tag_id = tags.id and tags.name = 'funny'; 

ここでは、このためのActive Recordの構文は次のとおりです。 – zarruq

答えて

0

一つのアプローチは、外側を使用することですCASE WHEN EXISTS表現と一緒に参加する:

>> Template.left_outer_joins(:tags) 
.where(tags: {name: 'funny'}) 
.select(:id, :name, 
"case when exists 
    (select pins.id from pins 
    where pins.tag_id = tags.id 
    and pins.template_id = templates.id) 
    then true else false end as pinned") 
.map {|t| [t.id, t.name, t.pinned] } 
[... sql output ...] 
=> [[1, "template1", true], [2, "template2", false]] 
+0

このアプローチをさまざまな方法で試してみましたが、うまくいかなかったのです。使用しているDBを指定していませんでした。これはPostgresであり、ケースの場合の戻り値の別名が好きではありません。また、このより簡単なクエリへのアプローチを適用していない場合は、 SELECT ID、合計 から注文 注文番号 \tいつでも(SELECT id、total FROM orders where orders.total> 100000)THEN true \t ELSE false END – bazfer

+0

この楽しい問題を解決するために動的クエリの生成を検討しています。しかし、助けてくれてありがとう。 – bazfer

+0

@bazfer私はその事実/構造があなたのために働いていないときに驚いています...私はPostgres(9.6)も使用していますが、私はスキーマを誤解しているかもしれません。私が使用していたスキーマを追加しました。訂正は歓迎します。 –

関連する問題