【问题标题】:Search form with multiple entry collection_select具有多个条目的搜索表单 collection_select
【发布时间】:2012-08-26 14:54:01
【问题描述】:

对于允许用户通过输入演员姓名来搜索电影的电影网站,我引用了Railscast on Advanced Search Forms,但在同一参数中搜索多个条目时遇到了困难。 (即多个参与者条目)。

下面的代码允许选择多个actor,但我不确定如何重写模型代码以允许多个actor_id。

非常感谢您的反馈!

搜索/new.html.erb

<%= f.label :actor_id %>
<%= f.collection_select :actor_id, Actor.order(:name), :id, :name, {}, {:multiple => true}%>

search.rb

def movies
  @movies ||= find_movies
end

private
  def find_movies
    movies = movies.where(actor_id: actor_id)
  end

【问题讨论】:

  • 您的 collection_select 是否将 id 作为参数中的值发送?
  • 嗨@KyleC。 “作为价值观”是什么意思?如果我选择两个演员(id=1 和 id=2),那么我会在我的日志中看到以下内容:Parameters: {"search"=&gt;{"actor_id"=&gt;["","1","2"]}, "commit"=&gt;"Search", "id"=&gt;"50"}
  • 您是否将这些查询保存在您的数据库中?
  • 目前,我只保存一个演员 ID,因为我的搜索表中只有一个 actor_id 列。如果我想允许最多选择三个演员,我的搜索表中是否需要三个 actor_id 列?如果是这样,我应该如何命名列?

标签: ruby-on-rails ruby-on-rails-3 search


【解决方案1】:

由于您将这些查询保存在数据库中,请尝试此操作

  def find_movies
     movies = Movie.order(:name)
     movies = movies.where(actor_id: actor_id) if actor_id.present?
  end

无需保存查询即可实现此功能

在你的 search.rb 中

    def find_movies(actors)
       movies = Movie.where(:actor_id => actors)
    end

然后在您发送参数的控制器操作中

  find_movies(params[:actor_id])

编辑

要从你的 actor_id 中提取 id,请使用这个

   ["actor_id", ["", "1", "2"]][1].delete_if {|f| f == ""}

所以你的方法应该是这样的

  def find_movies
      ids = self.actor_id[1].delete_if {|f| f == ""}
      movies = Movie.order(:name)
      movies = movies.where(actor_id: ids) if actor_id.present?
  end

【讨论】:

  • 谢谢@Kyle。实际上,我的代码与您上面建议的代码相同,但忘记包含定义movies 的第一行。但是,我仍然无法使用多个 actor_id 进行搜索。这仅在我从 collection_select 中删除 {:multple=&gt;true} 选项时才有效,并且只允许输入单个 actor_id。如何将其应用于多个actor_id?
  • 原因是您无法将数组保存到数据库中,您可以将您的actor_id列的值发布到您的数据库中,然后我们可以解析并将其转换为数组
  • 嗨@Kyle。我不确定您所说的value of your actor-id column in your db 到底是什么意思。目前,它是一个整数类型的列,并且对于每个搜索查询,保存一个 actor_id。我是否应该将此列更改为字符串,以便在将它们转换为字符串后可以保存多个actor_id?
  • 是的,我会将其设为字符串并用逗号分隔...我的意思是发布您正在保存的 actor_id 的值。我想知道它保存的格式(所有数字是合并还是分开)
  • "---\n- ''\n- '1'\n- '2'\n".scan(/\d+/) ,这只会从字符串
猜你喜欢
  • 1970-01-01
  • 2013-11-01
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
  • 1970-01-01
  • 2015-05-08
相关资源
最近更新 更多