2012-04-01 68 views
1

我正在學習rails教程。我在Section 11.3.1有一個問題,上市11.44代碼:Rails教程3.2 Ch11 SQL語法

def self.from_users_followed_by(user) 
    followed_user_ids = user.followed_user_ids.join(', ') 
    where("user_id IN (?) OR user_id = ?", followed_user_ids, user) 
end 

不會followed_user_ids返回USER_ID。

在stackoverflow搜索後,我找到了解決方案here,它表示只是刪除「連接」方法,它適用於我。

但我很好奇,爲什麼在刪除「連接」方法之前運行RSPEC時沒有錯誤。

在清單11.41:

subject { Micropost.from_users_followed_by(user) } 

it { should include(own_post) } 
it { should include(followed_post) } 

如果 「加盟」 方式將使SQL語句錯誤,爲什麼RSPEC通過呢?

有沒有人有同樣的問題?

更新2012.04.03

我用滑軌控制檯來檢查問題。

user = User.first 
ids = ids = user.following_users.map(&:id).join(', ') 

其中有

User Load (2.6ms) SELECT "users".* FROM "users" INNER JOIN "follows" ON 
"follows"."followable_id" = "users"."id" AND "follows"."followable_type" = 'User' WHERE  
"follows"."blocked" = 'f' AND "follows"."follower_id" = 1 AND "follows"."follower_type" 
= 'User' AND "follows"."followable_type" = 'User' 
=> "6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29,  
30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 
52, 55, 56, 5" 

然後SQL

Collection.where("user_id IN (?)", ids) 

結果是

Collection Load (0.7ms) SELECT "collections".* FROM "collections" WHERE (user_id IN 
('6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 
30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 
52, 55, 56, 5')) ORDER BY collections.created_at DESC 
=> [] 

它會返回一個空數組。

但我得到了我所有的rspec通過。仍然不知道。

+0

測試環境是否也在postgres上運行? – Sairam 2012-04-01 23:57:09

+0

在SQLite上運行測試和開發環境。 – Tim 2012-04-02 02:35:39

+0

更新了我的答案 – Jonathan 2012-04-05 09:02:09

回答

0

假設連接創建一個字符串'1,2,3',那麼也許你想join("','")('1','2','3'),但我不認爲這會工作 - 我相信PostgreSQL不喜歡ID作爲字符串。

或者:

Squeel是一個很好的SQL語法的寶石,你可以使用:

user = User.first 
ids = user.following_users.map(&:id) 
Collection.where{(user_id.like_any ids)} 

這將允許您爲整數的數組中傳遞和Squeel將設置查詢其中:

SELECT "collections".* FROM "collections" WHERE (("collections"."user_id" LIKE 1 OR "collections"."user_id" LIKE 2 OR "collections"."user_id" LIKE 3)) 

編輯:您還可以使用語法:

ids = User.first.following_users.pluck(:id) 
Collection.find_by_user_id(ids) 
+0

感謝您的回覆。但是我真正關心的是爲什麼當我運行Rspec測試時通過,但在運行應用程序時無法工作。 – Tim 2012-04-13 10:46:58

+0

PostgreSQL不喜歡作爲字符串AFAIK給出的ID。純粹的猜測,但你爲什麼不嘗試我的建議,與Squeel。 – Jonathan 2012-04-13 12:04:07

+0

我會盡力的。非常感謝你。 – Tim 2012-04-14 13:31:07