Может ли модель Rails быть связана с именем столбца другой модели?

Я ищу ссылки или документацию о том, как решить эту проблему моделирования данных рельсов. Это не кажется прямым.

У меня есть модель отчета со многими столбцами, такими как колесо, разрыв, подшипник и т. Д. В каждом столбце я сохраняю состояние детали как «хорошее» или «плохое». Это легкая часть.

Однако, если какой-либо из этих столбцов «плохой» при сохранении отчета, я использую обратный вызов after_save для создания нового экземпляра модели коррекции. В модели Correction я сохраняю report_id, а также название детали - колесо, обрыв и т.д.

Затем я хотел бы иметь возможность редактировать модель коррекции одновременно с редактированием модели отчета, используя accepts_nested_attributes_for. Это возможно? Как мне получить доступ к конкретному экземпляру модели коррекции, которая соответствует имени столбца отчета? Я не уверен, что было бы лучше использовать другой подход для этого.

Буду признателен за любые ссылки или документы, которые могут помочь.

Спасибо!


person ERG    schedule 16.12.2014    source источник


Ответы (1)


Посмотрите документацию здесь: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html accepts_nested_attribute позволит вам создавать исправления для данного отчета одновременно с его созданием. Но в вашем случае вы создадите исправления только после создания отчета, поэтому я не думаю, что вам нужно использовать accepts_nested_attribute.

Я думаю, что то, что вы хотели бы сделать, легко сделать, и это зависит от того, как вы реализовали свою модель отчетов и исправлений. Предположим, ваша модель похожа на эту:

class Report< ActiveRecord::Base
  has_many :corrections
  attr_accessible :wheel, :brake, etc...
  after_save :create_corrections_if_bad_parts

  def create_corrections_if_bad_parts
     # For each part if one of them is changed to false, it create a new correction
     self.attributes.keys.each do |key|
       if send(key + "_changed?") and !self.attributes[key]
          # Calling build will fill the report_id for you
          correction = self.corrections.build(broken_part: key)
          correction.save
       end
     end
  end
end

class Correction < ActiveRecord::Base
  belongs_to :report
  attr_accessible :broken_part
end

Эта модель предполагает, что у вас есть один столбец для каждой части, но если у вас слишком много частей, может быть лучше нормализовать базу данных или использовать хэш для хранения всей части.... Вы можете узнать больше об отношениях здесь: http://guides.rubyonrails.org/association_basics.html

person Typpex    schedule 17.12.2014
comment
Спасибо. Это действительно полезно. У меня модели настроены таким образом. Мой метод для create_corrections_if_bad_parts немного отличается. Однако как мне получить доступ к каждому исправлению в форме отчета/редактирования? - person ERG; 17.12.2014
comment
Я не уверен, что понимаю, но вы можете получить доступ ко всем исправлениям, относящимся к отчету, благодаря множеству ассоциаций. если вы выполните report.corrections, у вас будет доступ к массиву коллекций, связанных с данным отчетом :) - person Typpex; 17.12.2014
comment
Спасибо еще раз! Я знал, что могу использовать use report.corrections. Я просто пытался показать слишком много в одном представлении, поэтому я запутался. Я упростил рабочий процесс, чтобы сделать его проще. - person ERG; 18.12.2014