Наследование нескольких таблиц, столбцы недоступны из подкласса

ОБНОВЛЕНИЕ:
изменение table_name на self.table_name =, кажется, убедило рельсы использовать правильную таблицу.

Однако теперь я получаю эти странные ошибки

   Mysql2::Error: Unknown column 'templates.deleted_at' in 'where clause': SELECT `objekts`.* FROM `objekts`  WHERE (`templates`.`deleted_at` IS NULL)

ИСХОДНЫЙ ВОПРОС:

У меня есть шаблон и объект:

class Template < ActiveRecord::Base
  def status; 0; end # Template doesn't have a status column, so define default
end

class Objekt < Template
  table_name = "objekts" # there is a status column in this table
end

но когда я это делаю, Objekt.new.attributes в консоли выводятся только атрибуты из объекта Template и не перечисляются какие-либо из Objekt.

Каждый столбец в Template также доступен в Objekt, но Objekt имеет дополнительные 10 столбцов (в основном флаги).

что тут происходит? почему рельсы не подключают класс Objekt к таблице objekts?


person NullVoxPopuli    schedule 05.06.2013    source источник
comment
Не будет ли здесь лучше отношение has_many/belongs_to вместо использования шаблона метода шаблона? Шаблон в данном случае больше похож на класс base. Objekt должно быть связано с таблицей. Соглашение о конфигурации.   -  person ChuckJHardy    schedule 05.06.2013
comment
Что ж, в Template есть масса методов, которые должны быть и у Objekt. вот почему я думаю, что Наследование - лучший случай здесь. Mayble Table-Inheritance вообще не правильный термин. Я хочу, чтобы оба объекта имели совершенно отдельные таблицы... так получилось, что таблицы имеют общие имена столбцов. В основном я хочу поделиться методами между ними. Модуль не будет работать, потому что тогда он переопределяет определения столбцов Object (или будет).   -  person NullVoxPopuli    schedule 05.06.2013
comment
Я предпочитаю следовать образцу composition over inheritance. Не могли бы вы переместить методы из шаблона в модуль и включить/расширить их в Object по мере необходимости? Затем они оба могут наследовать от ActiveRecord::Base   -  person ChuckJHardy    schedule 05.06.2013


Ответы (1)


Ссылайтесь на комментарии выше, когда я говорю о композиции, а не о наследовании, я думал о чем-то вроде этого...

class Objekt < ActiveRecord::Base
  include Template

  def status
    self.random_column_name || super
  end
end

module Template
  def status
    0
  end
end
person ChuckJHardy    schedule 05.06.2013
comment
Следует отметить, что это работает, если статус не является именем столбца. Поскольку, например, у меня есть random_column_name в качестве столбца, я просто определил это в своем суперклассе и не определил его в модуле. Итак, что я узнал: модули можно использовать для общих методов между двумя активными моделями записей, так что эти методы не являются столбцами в одной из моделей. - person NullVoxPopuli; 05.06.2013
comment
Приятно слышать. Спасибо за галочку :) - person ChuckJHardy; 05.06.2013