Именованные области с наследованием в Rails 3 отображаются на неверную таблицу - PullRequest
3 голосов
/ 28 марта 2011

Я пытаюсь использовать наследование от класса с именованной областью действия:

Class A < ActiveRecord::Base
    scope :useful_scope, lambda { |value1, value2|
        where(:value1 => value1, :value2 => value2)
    end
end

Class B < A
    set_table_name "b"
end

Проблема, с которой я сталкиваюсь, состоит в том, что имя таблицы в запросах sql по-прежнему ссылается на таблицу класса A:

A.useful_scope("alpha", "beta").to_sql
 => "SELECT \"a\".* FROM \"a\" WHERE \"a\".\"value1\" = 'alpha' AND \"a\".\"value2\" = 'beta'"
B.useful_scope("alpha", "beta").to_sql
 => "SELECT \"b\".* FROM \"b\" WHERE \"a\".\"value1\" = 'alpha' AND \"a\".\"value2\" = 'beta'"

Обратите внимание, что имена таблиц в операторе WHERE по-прежнему относятся к A. Я модифицирую существующий гем с различными зависимостями от области действия класса A повсюду, поэтому мне нужно сохранить его текущий синтаксис.Я хочу сохранить спецификаторы имени таблицы в предложении WHERE SQL, чтобы гарантировать, что область будет вести себя хорошо, когда вложена в другие определения именованных областей.

Я пробовал следующее:

  • Использование лямбда-параметра для имени таблицы.Это нарушило синтаксис для других ссылок на область, которая предоставляла только текущие свойства 2.
  • Использование абстрактного класса для определения области.Произошла такая же привязка имени таблицы, но с использованием имени класса Абстрактного класса.
  • Использование области действия, определенной в модуле, включая модуль.Произошла такая же привязка имени таблицы.

Есть ли способ, которым я могу принудительно оценить область действия для каждого унаследованного класса, чтобы он не был явно отображен в таблицу родительских классов?

Ответы [ 2 ]

3 голосов
/ 29 марта 2011

Я решил использовать анонимную область для решения этой проблемы.Код выглядит следующим образом:

def self.useful_scope(value1, value2)
  scoped(:conditions => { :value1 => value1, :value2 => value2 })
end

Теперь он правильно оценивается как в родительском, так и в унаследованном классах и сохраняет требуемое поведение области.

2 голосов
/ 28 марта 2011

Попробуйте это:

class A < ActiveRecord::Base
  def self.useful_scope(value1, value2)
    where(:value1 => value1, :value2 => value2)
  end
end

Разница здесь в том, что Proc / lambda не определен, поэтому ключи: valueN не связываются с таблицей A.

...