Я пытаюсь использовать наследование от класса с именованной областью действия:
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.
- Использование абстрактного класса для определения области.Произошла такая же привязка имени таблицы, но с использованием имени класса Абстрактного класса.
- Использование области действия, определенной в модуле, включая модуль.Произошла такая же привязка имени таблицы.
Есть ли способ, которым я могу принудительно оценить область действия для каждого унаследованного класса, чтобы он не был явно отображен в таблицу родительских классов?