可交换记录范围的可交换性和顺序

时间:2017-05-03 20:56:52

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

"排序的位置" "过滤器" Rails中的(Desc或Asc)' Active Record查询在性能和逻辑方面很重要吗?

例如,以下范围1 sam作为范围2

SCOPE 1

scope :default_stream, -> { order(deal_end_date: :asc) } # this is the "sorting query"
scope :scope_1,
      lambda { default_stream.where('deal_start_date <= ? AND deal_end_date >= ?', Time.zone.now, Time.zone.now).where(is_cool: true) }

SCOPE 2

scope :scope_2,
      lambda { Deal.all.where('deal_start_date <= ? AND deal_end_date >= ?', Time.zone.now, Time.zone.now).where(is_cool: true).order(deal_end_date: :asc) }

我应该先使用&#34;排序查询&#34;那么其他过滤器(scope1)或相反的(scope2)?

不确定是否有影响,但请告知我,交易数量非常重要(&gt; 100000)

1 个答案:

答案 0 :(得分:2)

没关系。在您尝试读取结果的时间点之前,您的范围实际上不会被评估。 orderwhere子句可以按任何顺序附加到您的关系中,因为它们放在最终SQL查询中的相同位置。

如有疑问,请尝试双向并在您的范围内调用.to_sql。您会发现scope1.to_sqlscope2.to_sql相同。

鉴于一个简单的Post模型,您会发现Post.order(:name).where(active: true)Post.where(active: true).order(:name)产品相同 SQL:

select * from posts where active = true order by name

orderwhere都不会“先发生”,这是不可能的。生成的SQL查询只有一个,所有各种子句(where,order,limit,offset等)都可以用于生成语法上有效的查询。