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 范围或关系的问题。
将作用域应用于 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 范围或关系的问题。