2011-08-23 25 views
5

Tôi cần phải tìm các bản ghi theo thứ tự chính xác khi nó được chuyển vào làm tham số tìm kiếm.Ruby on Rails: Tìm các bản ghi mà không cần phân loại

Ví dụ, tôi có một chuỗi:

item_list = "23,12,54,45" 

Với truy vấn sau, tôi nhận được hồ sơ theo thứ tự tăng dần của 'item_list' - "12,23,45,54".

Inventory.find(item_list.split(",")) 

Làm cách nào để sửa đổi truy vấn trên sao cho nó trả về các bản ghi theo cùng thứ tự 'item_list'.

Cảm ơn.

+0

Có gì dataset lớn nhất bạn có kế hoạch sau khi trở lại? – Dex

Trả lời

4

Hãy thử điều này, mặc dù nó chỉ có thể làm việc trong MySQL:

Inventory.where("id IN (#{item_list})").order("find_in_set(id, '#{item_list}')") 

Đối với các tập dữ liệu nhỏ hơn bạn có thể cho của Ruby sắp xếp kết quả, nhưng tôi nghĩ rằng để cho cơ sở dữ liệu làm việc cho bạn là tốt nhất cho bộ lớn hơn.

0
item_list.split(",").collect do |item| 
    Inventory.find(item) 
end 
+1

Không nên thu thập thay vì mỗi cái? –

+0

Điều này sẽ kích hoạt nhiều truy vấn. –

+0

@Christopher: Có thể; phụ thuộc vào những gì bạn đang cố gắng làm. Trong một trường hợp chung, bạn có thể đúng. Tôi sẽ thay đổi nó ngay bây giờ. – jnevelson

0
unordered_records = Inventory.where(:id => item_list) 
item_list.collect { |id| unordered_records.detect { |x| x.id == id } } 
1

Làm sắp xếp trên các mặt hàng như thế này:

ids = item_list.split(',') 
items = Inventory.find(ids).sort_by { |i| ids.index(i.id) } 

này chỉ sử dụng một truy vấn và sort_by chỉ tính khối một lần cho từng hạng mục để phần đó không nên mà đắt. Nếu bạn có nhiều mục cần xử lý thì bạn có thể dễ dàng tạo Hash để ánh xạ id tới chỉ mục của nó và sử dụng nó trong khối sort_by.

Ý tưởng cơ bản là để sắp xếp một mảng bằng cách sử dụng cấu trúc của người khác, ví dụ:

>> a = [ 23, 11, 42, 5 ] 
>> b = [5, 23, 11, 42] 
>> b.sort_by { |i| a.index(i) } 
=> [23, 11, 42, 5]