2012-04-01 8 views
1

私はレールチュートリアルからレールを学習しています。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は戻りません:私は、リスト11.44のコードは、Section 11.3.1で問題を得ました。

stackoverflowで検索したところ、解決方法hereが見つかりました。これは「結合」メソッドを削除するだけで、うまく動作します。

しかし、「結合」メソッドを削除する前にRSPECを実行すると、エラーが発生しない理由が不思議です。リスト11.41で

subject { Micropost.from_users_followed_by(user) } 

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

RSPECが渡された理由を "参加する" 方法は、SQL文が間違っているでしょうか?

誰も同じ問題がありますか?

アップデート2012年4月3日

私はこの問題をチェックするために、レールコンソールを使用していました。その後、SQLを

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" 

を得た

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

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

テスト環境はポストグラムでも動作しますか? – Sairam

+0

テスト&開発環境がSQLite上で実行されます。 – Tim

+0

更新しました – Jonathan

答えて

0

が文字列'1,2,3'を作成し、その後、おそらくあなたは('1','2','3')を持っているjoin("','")にしたいが、私はこれがうまくいくとは思わない - 私は、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)) 

EDIT:あなたはまた、構文を使用することができます。

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

あなたの返事ありがとうございます。しかし、本当に懸念しているのは、私がRspecテストを実行すると合格になったのですが、アプリケーションを実行するときには動作しません。 – Tim

+0

PostgreSQLは文字列AFAIKとして与えられたIDを好まない。純粋な推測ですが、どうして私の提案をSqueelと一緒に試してみませんか? – Jonathan

+0

私はしようとします。どうもありがとうございました。 – Tim