Rails - 带有ActiveRecord的条件查询?

AnA*_*ice 0 activerecord ruby-on-rails ruby-on-rails-3

给出如下查询:

current_user.conversations.where("params[:projectid] = ?", projectid).limit(10).find(:all)
Run Code Online (Sandbox Code Playgroud)

params [:projectid]正在从jQuery ajax发送.有时这是一个整数,上面的工作正常.但是如果使用选择"所有项目,那就是''哪个rails变为0的值,这会产生无效的查询

如何用rails你说搜索参数[:projectid] =?如果定义?

谢谢

von*_*rad 5

我想你可能错误地输入了一下查询."params[:projectid] = ?"在任何情况下都不应该是有效的查询条件.

无论如何,你可以做一些条件语句:

if params[:project_id].blank?
  @conversations = current_user.conversations.limit(10)
else
  @conversations = current_user.conversations.where("project_id = ?", params[:project_id]).limit(10)
end
Run Code Online (Sandbox Code Playgroud)

虽然,我可能更喜欢这样的东西:

@conversations = current_user.conversations.limit(10)
@converstaions.where("project_id = ?", params[:project_id]) unless params[:project_id].blank?
Run Code Online (Sandbox Code Playgroud)

图片的标题说明:

  1. 你不必使用.find(:all).当需要结果集时(例如,当你这样做时@conversations.each),Rails将自动执行查询.
  2. 尽可能尝试遵循Rails的蛇形命名方案(例如project_id,相反projectid).从长远来看,你会为自己和合作者节省很多麻烦.

谢谢,但如果where查询允许说3个参数,project_id,project_status,...例如,那么除非想法不起作用.我很震惊Rails没有更好的方法来处理条件查询参数

编辑:如果你有多个参数可以作为查询的一部分,请考虑where以哈希作为其参数的事实.有了它,您可以轻松地动态构建参数哈希,并将其传递给where.这样的事情,也许:

conditions = [:project_id, :project_status, :something_else].inject({}) do |hsh, field|
  hsh[field] = params[field] unless params[field].blank?
  hsh
end

@conversations = current_user.conversations.where(conditions).limit(10)
Run Code Online (Sandbox Code Playgroud)

在上述情况下,你会遍历数组中的所有领域,并增加他们每个人所得到的哈希值,除非它是空白.然后,你将哈希传递给where函数,一切都很好,花花公子.