我正在尝试按类别搜索模型中的多个列。我试图使用Model.scoped,但在Rails 4中已弃用.Mode.all似乎返回所有模型,无论我的其他范围如何。是否有替代方法可以搜索模型上的列,并且我的代码看起来是否合适?希望有一个字段根据类别搜索多个列。对于我正在尝试做的事情,搜索宝石似乎有点矫枉过正。以下是我的文件。
vendor.rb (根据depa的评论编辑)
belongs_to :category
def self.search(name, phone, email)
scope = Vendor.all #still returns all in my model regardless of what I enter in search form.
scope = scope.where(name: name) if name
scope = scope.where(phone: phone) if phone
scope = scope.where(email: email) if email
scope
end
category.rb
has_many :vendors
vendors_controller.rb
def index
@vendors = Vendor.order('created_at DESC')
end
def search
@vendors = Vendor.search(params[:name], params[:phone], params[:email])
end
厂商/ index.html.erb
<%= form_tag search_vendors_path, method: :get do |f| %>
<%= text_field_tag :search, params[:search], placeholder: "Search Vendors" %>
<%= select_tag 'category', options_for_select(Category.all.map{|el| [el.name, el.id]}) %>
<%= submit_tag 'Search' %>
<% end %>
答案 0 :(得分:0)
Rails 4中的等价物只是.all
。当你只需要一种将其他查询链接到的方法时,这就是你想要的。
def self.search(name, phone, email)
scope = Vendor.all
scope = scope.where(name: name) if name
scope = scope.where(phone: phone) if phone
scope = scope.where(email: email) if email
scope
end
参考:http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html#method-i-all
您可以通过执行以下操作在控制台(在Rails 4.1.4下)中确认:
2.1.2 :001 > Vendor.all.class
=> Vendor::ActiveRecord_Relation
而且,如果您担心.all
会急切地加载您的关系,请放心并非如此。急切加载行为仅限于.load
方法。您也可以通过执行以下操作在控制台中确认:
2.1.2 :002 > scope = Vendor.all; scope = scope.where(name: "John Doe"); scope
您将看到它仅返回最后一个范围关系,而不是所有模型对象。