я столкнулся с каким-то неожиданное поведением в Active Record (3.2.13):ActiveRecord объединяется с текущими условиями при применении области?
Там есть простая сфера на моей модели:
class User < ActiveRecord::Base
scope :verified, lambda { where('verified = 1') }
end
Это может быть использовано прекрасно сами по себе:
User.verified.to_sql
#=> "SELECT \"users\".* FROM \"users\" WHERE (verified = 1)"
Когда я конкатенации where
-clauses, они and
ред как ожидалось:
User.where(company_id: 1).where(company_id: 2).to_sql
"SELECT \"users\".* FROM \"users\" WHERE \"users\".\"company_id\" = 1 AND \"users\".\"company_id\" = 2"
Проблема:
Однако, когда я приковать область видимости, мой первый, где-оговорка сбросили атомную бомбу, последний выигрывает в слиянии:
User.where(company_id: 1).where(company_id: 2).verified.to_sql
"SELECT \"users\".* FROM \"users\" WHERE \"users\".\"company_id\" = 2 AND (verified = 1)"
Как применять область действия на связь с существующими условиями?
(Те существующие условия были созданы с помощью канкан-х load_and_authorize_resource
, так что я не могу просто применить эти where
Морозов после применения моей сферы.)
«nuking», похоже, происходит в 'merge': http://apidock.com/rails/ActiveRecord/SpawnMethods/merge ... который, кажется, применяется при использовании' scope': http: // apidock. com/rails/ActiveRecord/Scoping/Named/ClassMethods/scope – crispy