我在查找以下Postgres查询的Active Record语法时遇到了一些问题:
SELECT *
FROM tracks
JOIN displays on displays.track_id = tracks.id
JOIN users on displays.user_id = users.id
WHERE user_id = 1
AND displays.display is true
AND tracks.likes_count > 200
上面的上述查询有效,现在我尝试将其转换为activerecord的语法,但收到错误:
PG :: SyntaxError:ERROR:语法错误在"''"'''''''第1行: ... ck_id" ="追踪"。" id" WHERE(displays.display是' t&#39 ;, track ...
Track.joins(:users, :displays).where('displays.display is ?, tracks.likes_count > ?, users.id = ?', true, 200, 1)
我似乎对displays.display is True
声明做错了,但我尝试了一些变化无济于事。
我使用的是Activerecord-4.2.0。
我很感激一些见解。
答案 0 :(得分:0)
默认情况下,ActiveRecord不知道如何加入曲目和用户,因此请注明您要通过显示加入:
Track.joins(:displays => :users).where('displays.display is true, tracks.likes_count > ?, users.id = ?', 200, 1)
希望我能很好地记住语法:)
答案 1 :(得分:0)
我认为问题在于连接,你可以试试这个:
Track.joins(displays: :users).where('displays.display = ?, tracks.likes_count > ?, users.id = ?', true, 200, 1)
您可以使用以下语法与第三个表进行连接:
Table1.joins(table2 :: table3)
结果:
SELECT "table1".*
FROM "table1"
INNER JOIN "table2" ON "table2"."table_id" = "table1"."table1_id"
INNER JOIN "table3" ON "table3"."table2_id" = "table2"."table2_id"
able3“ON”table3“。”table2_id“=”table2“。”table2_id“
您可以在此处阅读ActiveRecord联接方法的更多内容:http://guides.rubyonrails.org/active_record_querying.html#joining-tables
答案 2 :(得分:0)
看起来我实际上只是错过了AND ... .... derp:
Track.joins(:users, :displays).where('displays.display = ? AND tracks.likes_count > ? AND users.id = ? ', true, 200, 1)
UPDATE 同样@Andrius指出Track.joins(:users,:displays)和Track.joins(:displays =>:users)是两个不同的联接,我想使用前者。