2015-02-09 94 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