【问题标题】:rails scope multiple params轨道范围多个参数
【发布时间】:2014-10-18 22:58:33
【问题描述】:

我有一个User 模型。我的目标是拥有一个返回选定字段找到的users 的范围。

喜欢

scope :starts_with, ->(filter, starts_with) { where("? like ?", "#{filter}", "#{starts_with}%")}

这是我的看法:

<%= select_tag(:filter, options_for_select([["Name", "name"],
                                                  ["E-mail", "email"]],
                                                  "name"), {:multiple => true}) %>
<%= text_field_tag :starts_with, params[:starts_with] %>

UPD 我这样称呼作用域:

def index
  @users = User.starts_with(params[:filter, :starts_with]).paginate(page: params[:page], per_page: 40)
end

目前显示错误ArgumentError: wrong number of arguments(1 for 0)

感谢您的帮助!

【问题讨论】:

  • 您缺少一些可以帮助您的代码。请粘贴调用范围的行(如果错误消息与范围有关)。
  • 当然,更新了范围调用和错误!

标签: ruby-on-rails search scope


【解决方案1】:

将操作中的代码替换为:

def index
  @users = User.starts_with(params[:filter], params[:starts_with]).paginate(page: params[:page], per_page: 40)
end

发生了什么

在您最初的通话中,您使用User.starts_with(params[:filter, :starts_with])。注意params[:filter, :starts_with]。您将两个参数传递给参数hash[] 方法。此方法只接受一个参数。查看 ruby​​ 文档了解更多信息:

http://www.ruby-doc.org/core-2.1.2/Hash.html#method-i-5B-5D

params 是一个hash,就像您可能想在您的应用程序或任何红宝石代码中使用的任何其他hash。因此,您需要分别询问:filter:starts_with 键的值,而不是执行未经授权的params[:filter, :starts_with],并将它们作为参数传递给您的作用域,如下所示:

User.starts_with(params[:filter], params[:starts_with])

【讨论】:

  • 姆莱内斯,谢谢!现在它工作了,但是......它没有。它在唯一的情况下正确搜索:当查询由一个字母组成时。如果有更多字母,则选择返回空。我不明白为什么。
  • 有趣的是:如果我用 1 个参数创建一个作用域,它会很好地搜索:scope :starts_with, -&gt;(starts_with) { where("name like ?", "#{starts_with}%")},它会在日志SELECT "users".* FROM "users" WHERE (name like 'Ma%') LIMIT 40 OFFSET 0 中进行查询。但是,如果我使用多个参数,例如scope :starts_with, -&gt;(filter, starts_with) { where("? LIKE ?", filter, "#{starts_with}%")},它不会搜索超过 1 个字母(日志中的 SQL 是 SELECT "users".* FROM "users" WHERE ('name' like 'Ma%') LIMIT 40 OFFSET 0)。我认为这都是因为引号,但是如何摆脱它们呢?
  • 希望我描述清楚!我的意思是在 SQL 查询中引用 name =)
  • 我不是这个解决方案的忠实拥护者,但您可以像 where("#{filter} like ?", "#{starts_with}%") 那样插入第一个参数。这有什么改变吗?我会考虑并尝试想出更好的东西。也许使用 Arel。
  • 不,这不会改变。还尝试在视图中将“名称”更改为 :name。
猜你喜欢
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多