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

Active Record Scope modifies Active Record Relation. Why?

将作用域应用于 Active Record 关系会永久修改该关系。为什么?

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) }

更新

这似乎是 gem 章鱼的一个错误,请参见此处:https://github.com/thiagopradi/octopus/issues/455

对于其他上下文,由于 company_purchases 的组成方式而引入了 Octopus 错误。

company_purchases = company.purchases

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

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

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

参见:https://github.com/thiagopradi/octopus/issues/455