在Rails3中使用.where方法

时间:2011-01-07 16:45:01

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

我刚刚开始使用.where方法,我对如何充分利用它感到有些困惑。

我想做点什么:

@books = Book.where(:author_id => 1 || 2)

显然我知道这不起作用,但我试图证明我想要一些额外的逻辑。一些“或”“和”“不等于”等。

我可以在哪里研究这个想法吗?我正在寻找rails API,但我没有看到任何有用的东西。

谢谢!

4 个答案:

答案 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方法更优雅的方法。

Source and absence of documentation here

答案 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

tests