self.table_name, кажется, кеширует - PullRequest
1 голос
/ 12 февраля 2012

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