Active Record Scope修改Active Record Relation。为什么?

时间:2018-03-13 11:31:19

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

将范围应用于活动记录关系将永久修改关系。为什么呢?

company_purchases.to_sql
=> "SELECT \"purchases\".* FROM \"purchases\" WHERE \"purchases\".\"company_id\" = 17"

company_purchases.by_state("finalized").to_sql
=> "SELECT \"purchases\".* FROM \"purchases\" WHERE \"purchases\".\"company_id\" = 17 AND \"purchases\".\"state\" = 'finalized'"

company_purchases.to_sql
=> "SELECT \"purchases\".* FROM \"purchases\" WHERE \"purchases\".\"company_id\" = 17 AND \"purchases\".\"state\" = 'finalized'"

我希望在调用作用域时SQL看起来有所不同,但是我不明白为什么在没有作用域的情况下下一次调用where时作用域中的附加company_purchases仍然存在。

范围定义

scope :by_state, ->(state) { where(state: state) }

更新

这似乎是宝石八达通的一个错误,请参见此处:https://github.com/thiagopradi/octopus/issues/455

对于其他情况,由于company_purchases的组成方式,正在引入八达通错误。

company_purchases = company.purchases

# in Company model
def purchases
    Product.using(shard).where(company_id: id)
end

2 个答案:

答案 0 :(得分:0)

如果您default_scope,则会显示在您在该模型上进行的每个查询中。而是使用scope来避免上述问题。

答案 1 :(得分:0)

这似乎是Octopus的一个问题,而不是Active Record范围或关系。

请参阅:https://github.com/thiagopradi/octopus/issues/455