2016-04-05 25 views
0

这是更有效的(或以其他方式优选的):向where条件用逗号像这样分离:什么是列出多个wheres的首选方式?

previous_rsvps = Rsvp 
    .where(user_id: array_of_ids, 
    waitlist_position: nil, 
    and so on...) 

或链它们是这样的:

previous_rsvps = Rsvp 
    .where(user_id: array_of_ids) 
    .where(waitlist_position: nil) 
    and so on... 

或者是它最好使用SQL与运算是这样的:

query = <<-SQL 
    user_id IN (array_of_ids) 
    AND waitlist_position IS NULL 
    AND so on... 
SQL 
previous_rsvps = Rsvp.where(query) 

我有我的查询一些?参数,如果有什么差别。

+0

这取决于您的要求,但我更喜欢使用'sql',因为sql查询的运行速度更快,而且服务器的负担低于rails默认的ORM。 –

+0

谢谢,响应者。所有的答案都很有帮助。很高兴知道权衡所在的位置。 -Shauna – user962915

回答

0

这是比其他任何意见和偏好的问题。我更喜欢第一个示例中的方法,因为它更简洁易读。他们也应该翻译成非常相似的SQL,因此在所有情况下效率应该是相同的。

但是,在某些情况下,使用Ruby语法不适用于更复杂的查询,例如非传统表名称,加入多个模型等等。 Slo熟悉第三个例子的语法是非常重要的。

0

让我们尽可能地使用ActiveRecord的强大功能,并使用第一个或第二个(我会根据它们提供的可读性交替使用它们)。我个人认为它首先是一个可读性问题,然后是可维护性问题(这就是为什么我不会使用第三个,除非真的需要)。

0

在我看来,第一个版本是在你想重构你的代码,并通过周围的一些更多的参数或更复杂的查询,比如,如果你需要连接表和联合表内看情况更好:

condition = { waitlist_position:nil, user: {email:"some_email"} } 
Rsvp.joins(:users).where(condition) 

鉴于该条件是在其他地方动态生成的。通过这种方法,您可以将condition变量保留在其中,并在其他地方调整条件。

0

我建议避免链接在你的模型之外的调用,并保持你的模型的命名作用域方法中的查询逻辑。

Rsvp.for_user(user_id) 

class Rsvp 
    scope :for_user ->(user_id) do 
    where(user_id: user_id, waitlist_position: nil) 
    end 
end 

这会为您的实施增加更多的灵活性,使其清洁并允许避免不必要的代码重复。

下面是关于提到的想法很不错的文章:

http://craftingruby.com/posts/2015/06/24/say-no-to_chained-scopes.html

0

通常人们会用第一个版本。 Class.where(attr1: "lala", attr2: "lelo")

相关问题