动态查询不同的值rails 4 activerecord

时间:2013-12-29 04:20:17

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

以下是我在控制器中尝试的查询

query = []     如果是id           query =“category_id:#{id}”         端

    @posts = Post.where(query)

但是将错误抛出为ERROR: syntax error at or near ":"

为什么这不能用于其他任何方式呢

if id
    query << {sub_category_id: id}
end

if test
    query << {test_id: test}
end
    @posts = Post.where(query)

有没有办法像这样做

2 个答案:

答案 0 :(得分:1)

query更改为哈希而不是字符串:

if id
  query = { category_id: id }
end

@posts = Post.where(query)

query = "category_id: #{id}"不起作用的原因是因为提供的字符串在ActiveRecord生成的查询中逐字使用,即您的选择查询在where子句中将具有category_id: 1(假设id为1)。这不是一种有效的SQL语法。

请阅读this link之后的条件中如何使用字符串。感谢@RustyToms建议链接。

更新:(为query哈希添加额外条件)

if id
  query[:sub_category_id] = id
end

if test
  query[:test_id] = test
end

@posts = Post.where(query)

答案 1 :(得分:0)

另一种方法:

@posts = Post.scoped
@posts = @posts.where(category_id: id) if id

(如果你正在玩codegolf)

修改: (这绝对是一个与之无关的附注)

您的原始解决方案依赖于我最不喜欢的Ruby功能之一。请考虑以下代码:

if false
    a = 4
end
puts a

我希望puts a失败并出现NameError(未定义的局部变量“a”),但不是! Ruby解析器命中a =,然后将其值初始化为nil。因此,尽管运行if语句的内部存在无法,但它仍会影响其他代码。