2011-11-16 15 views
6

Tôi biết rằng tôi có thể làm một truy vấn cho cuốn sách gần đây dựa trên một mảng như trongLàm cách nào để sử dụng phạm vi được đặt tên trong mô hình của tôi dựa trên một mảng các mục?

scope :recent_books, lambda {|since_dt| {:conditions=>{:created_at >= since_dt}}}

nhưng làm thế nào tôi có thể làm một truy vấn tương tự khi tôi có một loạt các mặt hàng, ví dụ điều gì xảy ra nếu tôi muốn biết liệu có bất kỳ hồ sơ nào khớp với các ngày trong một mảng [date1, date2, date3, v.v.] không?

Tôi nghĩ rằng phải có phương pháp thu thập/tiêm/chọn/ánh xạ làm điều đó nhưng tôi không chắc chắn từ việc đọc chúng.

Trả lời

16

Nếu bạn chuyển mảng dưới dạng giá trị, ActiveRecord đủ thông minh để so sánh để đưa vào mảng. Ví dụ,

Book.where(:author_id => [1, 7, 42]) 

tạo ra một truy vấn SQL với một điều khoản WHERE tương tự như:

WHERE "author_id" IN (1, 7, 42) 

Bạn có thể tận dụng lợi thế về điều này trong một scope giống như cách bạn sẽ đặt điều kiện bình thường:

class Book < .... 
    # Rails 3 
    scope :by_author, lambda { |author_id| where(:author_id => author_id) } 

    # Rails 2 
    named_scope :by_author, lambda { |author_id 
    { :conditions => {:author_id => author_id} } 
    } 
end 

Sau đó, bạn có thể chuyển một ID duy nhất hoặc một mảng ID tới by_author và nó sẽ chỉ hoạt động:

Book.by_author([1,7,42]) 
+0

thx tuyệt vời . Sẽ chấp nhận trong 6 phút (SO hạn chế). –

+0

Mặc dù tôi biết cú pháp đã thay đổi một chút từ 'named_scope' của rails2, nhưng cách tiếp cận lambda có hoạt động tốt trong rails2 không? Thx, Michael. –

+0

Vâng. Lần đầu tiên tôi sử dụng cú pháp này với Rails 2, bao gồm một số phạm vi được đặt tên phù hợp với mảng. Bạn sẽ chỉ phải thay đổi lệnh 'where' thành băm' conditions'. – David

4

Trong Rails 4, tôi có thể kiểm tra sự bao gồm một chuỗi trong một thuộc tính mảng bằng cách sử dụng một phạm vi như thế này:

scope :news, -> { where(:categories => '{news}') } 

Hoặc với một cuộc tranh cãi:

scope :by_category, ->(category) { where(:categories => "{#{category}}") } 
+0

cảm ơn, điều này đã giúp tôi rất nhiều. {} xung quanh {news} tạo nên sự khác biệt. Không giống với cú pháp đó .. – Ren

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