Где (хэш), за которым следует Scoped Где (хэш) в ActiveRecord - PullRequest
3 голосов
/ 16 сентября 2011

Проще говоря:

class Project
  scope :with_status_1, where(:status => 'test1')
  scope :with_status_2, where('status = ?', 'test2')
end


Project.where(:status => 'test1').where(:status => 'test2')
  Project Load (0.4ms)  SELECT "projects".* FROM "projects" WHERE "projects"."status" = 'test1' AND "projects"."status" = 'test2'

Project.where(:status => 'test').with_status_1
  Project Load (0.5ms)  SELECT "projects".* FROM "projects" WHERE "projects"."status" = 'test1'

Project.where(:status => 'test').with_status_2
  Project Load (0.5ms)  SELECT "projects".* FROM "projects" WHERE "projects"."status" = 'test' AND "projects"."status" = 'test2'

Project.where('status = ?', 'test').with_status_1
  Project Load (0.4ms)  SELECT "projects".* FROM "projects" WHERE "projects"."status" = 'test' AND "projects"."status" = 'test1'

Project.with_status_1.where(:status => 'test')
  Project Load (0.4ms)  SELECT "projects".* FROM "projects" WHERE "projects"."status" = 'test1' AND "projects"."status" = 'test'

Project.with_status_1.where(:status => 'test').with_status_1
  Project Load (0.4ms)  SELECT "projects".* FROM "projects" WHERE "projects"."status" = 'test1'

Почему дела № 2 и № 6 устраняют предыдущие условия?

Редактировать: Rails 3.1

1 Ответ

0 голосов
/ 16 сентября 2011
Предложение

where отправляет свои аргументы на build_where

def build_where(opts, other = [])
  case opts
  when String, Array
    [@klass.send(:sanitize_sql, other.empty? ? opts : ([opts] + other))]
  when Hash
    attributes = @klass.send(:expand_hash_conditions_for_aggregates, opts)
    PredicateBuilder.build_from_hash(table.engine, attributes, table)
  else
    [opts]
  end
end

Таким образом, в случае Hash он будет перезаписывать ключи, так как он добавляет новые параметры хеширования к существующему хешу. И если вы передаете String или Array, то оно будет суммироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...