1

UPDATE:
change_name_name to self.table_name = похоже, убедил рельсы использовать правильную таблицу.Множественное наследование таблиц, столбцы недоступны из подкласса

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

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

ORIGINAL ВОПРОС:

У меня есть шаблон, и Objekt:

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?

+0

Будет ли 'has_many/belongs_to' отношения не лучше здесь вместо того, чтобы использовать метод шаблона Pattern ? Шаблон в этом случае скорее является «базовым». 'Objekt' должен относиться к таблице. Контракт над конфигурацией. – CharlesJHardy

+0

Ну, у шаблона есть масса методов, которые Objekt также должен иметь. вот почему я считаю, что Наследие - лучший случай. Mayble Table-Inheritance - не правильный термин. Я хочу, чтобы оба объекта имели полностью отдельные таблицы. Просто случается так, что в таблицах используются имена столбцов. В основном, я хочу поделиться методами между ними. Модуль не будет работать, потому что тогда он переопределяет определения столбцов Objekt (или будет). – NullVoxPopuli

+1

Я предпочитаю следовать шаблону 'состав над наследованием'. Не могли бы вы переместить методы из шаблона в модуль и включить/расширить их в Objekt, если необходимо? Затем они могут наследоваться от «ActiveRecord :: Base» – CharlesJHardy

ответ

1

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

class Objekt < ActiveRecord::Base 
    include Template 

    def status 
    self.random_column_name || super 
    end 
end 

module Template 
    def status 
    0 
    end 
end 
+0

. Следует отметить, что это работает, если статус не является именем столбца. Поскольку, например, у меня есть random_column_name как столбец, я просто определил это в своем «Суперклассе» и не определил его в модуле. Итак, что я узнал: Модули могут использоваться для общих методов между двумя активными образцами, так что эти методы не являются столбцами в одной из моделей. – NullVoxPopuli

+0

Приятно слышать. Спасибо за тик :) – CharlesJHardy

Смежные вопросы