Tôi đã gặp phải vấn đề này nhiều lần: Tôi muốn áp dụng phạm vi truy vấn, nhưng chỉ khi tham số được chuyển đến phạm vi không phải là null . Vì vậy,Rails, áp dụng phạm vi hoặc không phụ thuộc vào việc tham số là nil
tags = Tag.where(name: params[:name]) if params[:name]
Tuy nhiên, có hai vấn đề với điều này. Một là Rails sẽ đánh giá truy vấn ngay lập tức và vì vậy nếu tôi muốn áp dụng nhiều điều kiện hơn cho nó, hãy nói
tags.where(location: params[:place]) if params[:place]
Nó sẽ truy vấn lại DB. Vấn đề thứ hai là nó không trông rất đẹp, mà tôi đã cố gắng để có được xung quanh với các phương pháp lớp.
class Tag < ActiveRecord::Base
def self.name_like this_name
if !this_name.blank?
where("name ILIKE '%#{this_name}%'")
else
#what do I put here? `all` does not work
end
end
end
Tuy nhiên, tôi không thể chỉ đơn giản là chỉ cần đặt all
trong đó, vì điều đó đánh giá truy vấn. Có suy nghĩ gì không?
Aha! Nó hoạt động. Tại sao bạn có thể chuỗi này cùng với các phạm vi khác trong một phạm vi lambda nhưng bạn không thể với các phương thức lớp? Ví dụ, làm một cái gì đó như 'Tag.name_like (" stuff "). Where (...). All' ...... – varatis
Có bạn có thể (Rails 3), phạm vi chuỗi nên có thể theo như phạm vi/phương thức trả về AR :: Quan hệ. (Bạn không cần phải gọi 'tất cả' ở cuối) – MrYoshiji
Vâng và ngoài ra bạn không thể gọi tất cả. Giải pháp này chỉ hoạt động nếu bạn không, trên thực tế. Tôi chỉ chỉnh sửa nó để chấp nhận rằng – varatis