我刚刚开始使用.where方法,我对如何充分利用它感到有些困惑。
我想做点什么:
@books = Book.where(:author_id => 1 || 2)
显然我知道这不起作用,但我试图证明我想要一些额外的逻辑。一些“或”“和”“不等于”等。
我可以在哪里研究这个想法吗?我正在寻找rails API,但我没有看到任何有用的东西。
谢谢!
答案 0 :(得分:26)
1 || 2
将不起作用,因为该表达式在函数调用之前被计算(它的计算结果为1,所以它应该等同于Book.where(:author_id => 1)
。我会这样做:
@books = Book.where(:author_id => [1, 2])
生成的SQL将是WHERE author_id IN (1, 2)
。
答案 1 :(得分:4)
看看MetaWhere,https://github.com/ernie/meta_where - 这可以让这种事情变得非常巧妙:)
答案 2 :(得分:3)
查看源代码(没有合适的文档!),你可以通过SQL,它可以像sql一样参数化:条件等,所以你可以这样做:
@books = Book.where("author_id = 1 OR author_id = 2")
不适合下拉到原始SQL,但我看不到使用where方法更优雅的方法。
答案 3 :(得分:1)
听起来你可能想看看Arel更复杂的事情。它已内置到Rails 3中(AR在内部使用它。)
book = Book.arel_table
# range
Book.where(book[:author_id].gt(0).and(book[:author_id].lt(3))
#or
Book.where(b[:author_id].eq(0).or(t[:author_id].eq(3).order(:first_name))
#joins
book.join(authors).on(book[:author_id].eq(author[:id])).
where(book[:title].matches 'hokum n stuff')
还分组,聚合等等。缺点是文档很少。 docs