Rails 4在模型中搜索列

时间:2014-08-07 02:09:39

标签: search ruby-on-rails-4 deprecated

我正在尝试按类别搜索模型中的多个列。我试图使用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 %>

1 个答案:

答案 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

您将看到它仅返回最后一个范围关系,而不是所有模型对象。