2015-02-09 89 views
0

我遇到一些麻烦搞清楚活动记录语法如下Postgres的查询:转换SQL语句的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: syntax error at or near "'t'" LINE 1: ...ck_id" = "tracks"."id" WHERE (displays.display is 't', 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。

我将不胜感激。

+1

'是[not] true'且'not [not] false'被认为是后缀运算符(或者有些类似于特殊语法)。你不能参数化它们中的“true”/“false”部分。如果'display'列不能为'NULL',则可以使用'displays.display =?'。 – pozs 2015-02-09 16:28:31

+0

我看到,你不能参数化一个布尔值....我怎么能参数化其他领域,仍然设置布尔值?我尝试了一些你建议的不同变体,但没有运气。 – theartofbeing 2015-02-09 16:40:13

+0

不,你可以(一般情况下)传递一个布尔参数,但你的情况('是true')是特殊的。 – pozs 2015-02-09 16:44:10

回答

0

看起来像我其实只是缺少与运算.... 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)是两个不同的连接,我想使用前者。

0

默认情况下的ActiveRecord不知道如何加入音轨和用户,因此表明您希望通过显示器加入:

Track.joins(:displays => :users).where('displays.display is true, tracks.likes_count > ?, users.id = ?', 200, 1) 

希望我能记得的语法以及:)

+0

是不是这个例子我在这里'Track.joins(:users,:displays)' – theartofbeing 2015-02-09 19:28:09

+1

'Track.joins(:users,:displays)'和'Track.joins(:displays =>:users) '是两种不同的联结。在第一种情况下,两个内部联接都使用“Track”作为参考,第二种情况下,第一个内部联接考虑了“Track”,但第二个内部联接仅在“显示”和“用户”之间。 – 2015-02-09 20:29:21

0

我觉得问题出在连接,你可以试试这个:

Track.joins(displays: :users).where('displays.display = ?, tracks.likes_count > ?, users.id = ?', true, 200, 1) 

您可以使用语法与第三表的连接:

Table1.joins(表2:表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“ 表3 table2_id”=“ 表2 table2_id”

你可以阅读更多ActiveRecord的的加入方法在这里:http://guides.rubyonrails.org/active_record_querying.html#joining-tables

+0

我认为这正是我在这里所做的:'Track.joins(:users,:displays)' – theartofbeing 2015-02-09 19:29:01