以下是我在控制器中尝试的查询
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)
有没有办法像这样做
答案 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
语句的内部存在无法,但它仍会影响其他代码。