"排序的位置" "过滤器" 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)
答案 0 :(得分:2)
没关系。在您尝试读取结果的时间点之前,您的范围实际上不会被评估。 order
和where
子句可以按任何顺序附加到您的关系中,因为它们放在最终SQL查询中的相同位置。
如有疑问,请尝试双向并在您的范围内调用.to_sql
。您会发现scope1.to_sql
与scope2.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
order
或where
都不会“先发生”,这是不可能的。生成的SQL查询只有一个,所有各种子句(where,order,limit,offset等)都可以用于生成语法上有效的查询。