我在为以下Postgres查询找出活动记录语法时遇到了一些困难:
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的语法,但得到了错误:
语法错误:错误:语法错误在“t”行1:...ck_id=“轨道”。“id”在其中(displays.display不在),跟踪.
Track.joins(:users, :displays).where('displays.display is ?, tracks.likes_count > ?, users.id = ?', true, 200, 1)似乎我对displays.display is True语句做错了什么,但是我尝试了几个变体,但都没有用。
我正在使用Activerecord-4.2.0。
我会感谢你的一些见解。
发布于 2015-02-09 20:31:55
看起来我实际上只是错过了ANDs....derp:
Track.joins(:users, :displays).where('displays.display = ? AND tracks.likes_count > ? AND users.id = ? ', true, 200, 1)正如@Andrius指出的那样,更新也指出了Track.joins(:users,:displays)和Track.joins(:Displays=> :users)是两个不同的联接,我想使用前者。
发布于 2015-02-09 17:05:00
默认情况下,ActiveRecord不知道如何连接轨道和用户,因此请指示要通过显示进行连接:
Track.joins(:displays => :users).where('displays.display is true, tracks.likes_count > ?, users.id = ?', 200, 1)希望我能记住语法:)
发布于 2015-02-09 17:36:42
我认为问题在于连接,您可以尝试如下:
Track.joins(displays: :users).where('displays.display = ?, tracks.likes_count > ?, users.id = ?', true, 200, 1)您可以使用以下语法与第三个表进行连接:
表1.联接(table2::table3 3)
结果:
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的联接方法:querying.html#joining-tables
https://stackoverflow.com/questions/28414417
复制相似问题