По разным причинам я не буду вдаваться в подробности, нам нужно реализовать настройку «таблица на клиента» для нескольких наших моделей.Для большинства клиентов подойдет таблица по умолчанию.Но для некоторых нам нужно указать модель на другую таблицу.Имя таблицы хранится в записи клиента как custom_table_name.Вот как я пытался это сделать в Rails (2.3.10):
g rails
В консоли предположим, что для клиента с идентификатором 10 для custom_table_name установлено значение 'big_co_foos'
Foo.customer = Customer.find(10)
Foo.table_name
#outputs "Foo.table_name called"
#then "big_co_foos"
Выглядит хорошо, но попробуйте позвонить Foo.table_name
еще раз
Foo.table_name
#outputs "foos"
Имя таблицы не "прилипает".Из того, что я могу сказать, вызов super
в self.table_name
является виновником.Если я не вызываю super в этом методе, локальная функция вызывается каждый раз.Но я, очевидно, не буду повторно реализовывать table_name здесь.Я подозреваю, что я должен что-то упустить из-за того, что методы класса наследуют против методов экземпляраЕсть предложения?
Кроме того, я попытался использовать переменную класса (@@ customer), но это не имело значения.
Наконец, взглянув на исходный код Rails, я попытался вызвать reset_table_name
вместо super
, но, похоже, он дал тот же результат, что и вызов super
(то есть последующие вызовы Foo.table_name
были пропущены).
Обновление: похоже, работает
class Foo < ActiveRecord::Base
@customer = nil
def self.customer=(value)
@customer = value
if @customer && @customer.table_name
self.set_table_name(@customer.table_name)
else
self.reset_table_name
end
end
end