2012-03-26 8 views
6

私はレール3とsqlite dbに取り組んでいます。 INクエリを使用しています。 現在、項目の文字列変数をINクエリに渡します。 しかし、そのクエリを実行している間、それは動作しません。 この状況を乗り越えるには?ここでレールでINクエリにデータを渡す方法3

が私のコードである

items = "" 
items << "#{@invitation_user1.id}" << "," << "#{@invitation_user2.id}" << "," << "#{@user1.id}" << "," << "#{@user2.id}" << "," << "#{@user2.id}" << "," << "#{@profile1.id}" << "," << "#{@profile2.id}" 
@activities = Version.where("item_id IN (?)","#{items}") 

は、items.to_iをしようとしましたitems.to_sが、うまくいきませんでした。 ログで私はこれを見ることができます。

SELECT "versions".* FROM "versions" WHERE (item_id IN ('19,20,4,1,1,4,1')) 

しかし、私が必要とするすべてではなく、文字列の

SELECT "versions".* FROM "versions" WHERE (item_id IN (19,20,4,1,1,4,1)) 

答えて

22

あなただけに配列を渡すことができますRailsはそれで正しいことをしてくれている:。

items = [ 
    @invitation_user1.id, 
    @invitation_user2.id, 
    @user1.id, 
    @user2.id, 
    @profile1.id, 
    @profile2.id 
] 

@activities = Version.where("item_id IN (?)", items) 
# or equivalently: 
@activities = Version.where(:item_id => items) 

Railsが適切にすべて合格のエスケープを扱うように、これは非常に、あなたの変種よりも優先されます使用されているデータベース・アダプターの値。

1

使用配列です。

ids = [ @invitation_user1.id, @invitation_user2.id, @user1.id, @user2.id ] 

例えば

次に簡単に、あなたはこれは、あなたが期待されるクエリを発生します

@versions = Version.find_all_by_id(ids) 

でレコードを検索することができます。

SELECT "versions".* FROM "versions" WHERE (item_id IN (19,20,4,1)) 
1

何を探してるんですがsplitです:

[1] pry(main)> a = '19,20,4,1,1,4,1' 
=> "19,20,4,1,1,4,1" 
[2] pry(main)> a.split(',') 
=> ["19", "20", "4", "1", "1", "4", "1"] 
[3] pry(main)> a.split(',').map(&:to_i) 
=> [19, 20, 4, 1, 1, 4, 1] 

しかし、あなたは、配列を使用した方が良い、手動で「文字列」を構築しているよう:とにかく

items = Array.new 
items << @invitation_user1.id << @invitation_user2.id << @user1.id 
items << @user2.id << @user2.id << @profile1.id << @profile2.id 
@activities = Version.where(item_id: items) 

を取得する方法idsは奇妙です。なぜなら、ユーザーを追加したらどうなりますか?またはプロファイル?

私は何だろう(私たちはあなたの例で見ることができる限り少ないを見て)

items = Array.new 
items << get_invitation_user_ids 
items << get_user_ids 
items << get_profile_ids 
@activities = Version.where(item_id: items) 

以降、これらのメソッドを定義する、のように:

def get_invitation_user_ids 
    InvitationUser.select(:id).map(&:id) 
end 

... 
関連する問題