将SQL语句转换为Active Record语法

时间:2015-02-09 16:24:15

标签: ruby postgresql activerecord

我在查找以下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。

我很感激一些见解。

3 个答案:

答案 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)是两个不同的联接,我想使用前者。