2012-03-26 19 views
6

Tôi đang làm việc trên đường ray 3 và sqlite db. Sử dụng truy vấn IN. Hiện đang chuyển một biến chuỗi của các mục vào truy vấn IN. Nhưng Trong khi thực hiện truy vấn đó phải mất '' để nó không hoạt động. Làm thế nào để vượt qua tình trạng này?Cách chuyển dữ liệu sang truy vấn IN trong đường ray 3

Đây là mã của tôi

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}") 

Cố gắng items.to_i, items.to_s nhưng đã không làm việc. Trong nhật ký tôi có thể thấy điều này.

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

Nhưng tất cả tôi cần là

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

Trả lời

22

Bạn chỉ có thể vượt qua một mảng trong Rails là đủ thông minh để để điều đúng đắn với nó:.

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) 

này là bao la ưa thích hơn biến thể của bạn, như Rails đúng cách xử lý thoát của tất cả trôi qua giá trị cho bộ điều hợp cơ sở dữ liệu đã sử dụng.

1

Sử dụng mảng thay vì chuỗi.

Ví dụ

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

Sau đó một cách dễ dàng, bạn có thể tìm thấy các hồ sơ bằng

@versions = Version.find_all_by_id(ids) 

này sẽ cho kết quả truy vấn mà bạn mong đợi.

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

gì bạn đang tìm kiếm là 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] 

Nhưng, như bạn đang xây dựng 'string' bằng tay, tốt hơn để sử dụng một mảng:

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) 

Dù sao, cách để có được các id là lạ vì ... điều gì sẽ xảy ra nếu bạn thêm nhiều người dùng hơn? hoặc hồ sơ?

Những gì tôi sẽ làm gì (chứng kiến ​​ít nhất là chúng ta có thể thấy trong ví dụ của bạn)

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

và sau đó xác định các phương pháp đó, như trong:

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

... 
Các vấn đề liên quan