Направляющие возражают наследованию с belongs_to

У меня есть простые has_many/belongs_to отношения между Отчетом и Диаграммой. Проблема, которую я имею, - то, что моя модель Chart является родителем, который имеет детей.

Таким образом в моей модели Report я имею

class Report < ActiveRecord::Base
  has_many :charts
end

И моя модель Chart является родителем, где Круг, Строка, Панель все наследовались Диаграмме. Я не уверен где belongs_to: отчет принадлежит в рамках модели диаграммы или детей модели диаграммы. Я получаю ошибки, когда я пытаюсь получить доступ к chart.report, потому что объект имеет тип "Класс"

неопределенная локальная переменная или метод 'сообщают' для # <Class:0x104974b90>

Модель Chart использует STI, таким образом, его получение по запросу говорит.. 'Пол' из chart_type столбца в таблице диаграмм.. что я пропускаю?

Править

      Chart
      /  \
    Pie  Line
    / \
   /   \
Gender Sex

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

У меня есть чувство что его вызванный

@chart.update_attributes(params[:chart])

потому что при представлении на самом деле параметрические усилители [: диаграмма] ее параметрические усилители [: пол] или параметрические усилители [: пол]

5
задан Daniel Daranas 28 August 2013 в 16:37
поделиться

4 ответа

Ваша проблема в том, что у вас есть один контроллер, который принимает все эти разные типы моделей. Когда вы используете помощники форм Rails, они берут тип объекта из экземпляра и используют его для заполнения параметров. Это означает, что у вас есть params [: пол] вместо 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 December 2019 в 18:59
поделиться

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

 belongs_to :report

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

1
ответ дан 14 December 2019 в 18:59
поделиться

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

class Report < ActiveRecord::Base
  has_many :charts
end

class Chart < ActiveRecord::Base
  belongs_to :report
end

и вызвать

@chart.report
@pie.report
@line.report
@bar.report
2
ответ дан 14 December 2019 в 18:59
поделиться

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

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

0
ответ дан 14 December 2019 в 18:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: