Наследование объекта Rails с принадлежащим - PullRequest
5 голосов
/ 14 июня 2010

У меня есть простое отношение has_many / own_to между Report и Chart.У меня проблема в том, что моя модель Chart - это родитель, у которого есть дети.

Итак, в моей модели Report у меня есть

class Report < ActiveRecord::Base
  has_many :charts
end

И моя модель Chart - это родитель, где PieЛиния, Бар все наследуются от диаграммы.Я не уверен, где принадлежит принадлежащий отчету в рамках модели диаграммы или дочерних элементов модели диаграммы.Я получаю ошибки при попытке доступа к chart.report, потому что объект имеет тип "Class"

неопределенная локальная переменная или метод `report 'для #

Модель Chart использует STI, поэтому ее вывод говорит "Пол" из столбца chart_type в таблице диаграмм ... что мне не хватает?

РЕДАКТИРОВАТЬ

      Chart
      /  \
    Pie  Line
    / \
   /   \
Gender Sex

Я (используя STI) создаю экземпляр объекта типа Пол или Пол.Надеюсь, это поможет немного больше.

У меня есть ощущение, что это вызвано

@chart.update_attributes(params[:chart])

, потому что при отправке его фактически params [: chart] его params [: пол] или params [:пол]

Ответы [ 4 ]

2 голосов
/ 29 июня 2010

Ваша проблема в том, что у вас есть один контроллер, получающий все эти различные типы моделей.Когда вы используете помощники форм Rails, они берут тип объекта из экземпляра и используют его для заполнения параметров.Это означает, что у вас есть params[:gender] вместо params[:chart]

. Это можно исправить, переопределив метод, который Rails использует для генерации формы.Поместите следующий код в базовый класс диаграммы:

def self.model_name
  name = "chart"
  name.instance_eval do
    def plural;   pluralize;   end
    def singular; singularize; end
  end
  return name
end

Теперь любой класс, являющийся дочерним элементом Chart, будет передан в ваше действие получения как params[:chart]

.изменение имени объекта, как я обрисовал выше может нарушить функциональность некоторых плагинов / гемов, которые на него полагаются.Вы должны посмотреть на наличие нескольких контроллеров.Вместо ChartsController для получения всех данных используйте GenderChartsController и LineChartsController.Это дает два преимущества:

  1. Вам не нужно менять имя объекта
  2. Если вам понадобится специальный код для определенного типа диаграммы в будущем, у вас нетдобавить условные операторы, чтобы заставить его работать, поскольку различные контроллеры разделили его для вас.
2 голосов
/ 14 июня 2010

Вы должны использовать только

class Report < ActiveRecord::Base
  has_many :charts
end

class Chart < ActiveRecord::Base
  belongs_to :report
end

и звонить

@chart.report
@pie.report
@line.report
@bar.report
1 голос
/ 14 июня 2010

Если все типы диаграмм принадлежат отчету, то поместите

 belongs_to :report

в родительскую модель (я думаю, это модель диаграммы в вашем случае).

0 голосов
/ 29 июня 2010

Ваш столбец chart_type необходимо переименовать в type, если вы явно не перезаписали Base.inheritance_column.

Вы явно переименовали столбец наследования одной таблицы в chart_type?

...