Как получить доступ и представить связанные полиморфные модели в той же форме, в Rails? - PullRequest
3 голосов
/ 24 июня 2009

Предположим, у меня есть 3 модели, Car, Motorcycle и Truck, и для каждой из них мне нужно ввести несколько вещей, таких как список известных предыдущих владельцев, дорожные билеты, номерные знаки и т. Д. Поэтому я создал модель для каждого (PreviousOwners, PreviousPlates и т. Д.) И установил полиморфные ассоциации для связанных моделей.

Проблема в том, как я могу ввести все это, используя только одну форму, вроде этого:

Car #123

Known previous owners:
Jason Jazz
Brian Bass [add another]

Known previous license plates:
12345
67890 [add another]

Current status:
Cleared 
(this is a dropdown select menu, CurrentStatus is also a polymorphic association, but with predefined values.)

etc

Это оказывается сукой, далеко за пределами моего уровня знаний (новичок здесь). Ресурсы не являются вложенными, и почти все, что я нахожу в нескольких моделях, предназначено для вложенных ресурсов, и, похоже, ничто не относится к полиморфным ассоциациям.

(Это всего лишь пример, я знаю, что в идеале у меня должна быть модель Vehicle с категорией «Автомобиль» и т. Д., Но это просто для иллюстрации реальной необходимости полиморфных моделей в моем случае.)

Спасибо.

Ответы [ 6 ]

2 голосов
/ 26 июля 2009

Вы можете использовать новые вложенные атрибуты в Rails 2.3, но есть определенный способ написать его, чтобы он работал. Хитрость заключается в том, что вам нужно создать реальный полиморфный объект, а затем построить класс, в котором есть принадлежность к полиморфному предложению. Это пример, который я нашел в Ryans Scraps , опубликованный пользователем по имени: Superslau (я его немного исправил):

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

 class Task < ActiveRecord::Base
   has_many :assets, :dependent=>:destroy
   accepts_nested_attributes_for :assets, :allow_destroy => true
   belongs_to :workable, :polymorphic => true
 end



 class Upload < ActiveRecord::Base
   has_one :task, :as => :workable, :dependent=>:destroy
   accepts_nested_attributes_for :task, :allow_destroy => true 
 end

Загрузка является своего рода задачей. Все задачи может иметь один или несколько загруженных ресурсов.

Мне потребовалось время, чтобы понять, что я следует использовать модель загрузки в качестве Родитель. Так что в одной форме я могу создать загрузка и соответствующая задача запись вместе с загрузкой файла.

в моем контроллере:

 def new   
  @upload = Upload.new  
  @upload.task = Task.new  
  @upload.task.assets.build 
 end 

Не беспокоиться, если это не имеет никакого смысла, Я просто хотел, чтобы люди знали, что accepts_nested_attributes_for работает просто отлично с полиморфным ассоциации. Спасибо, Элой!

2 голосов
/ 21 июля 2009

Может быть, PresenterPattern тоже полезен:

http://blog.jayfields.com/2007/03/rails-presenter-pattern.html

Основная идея заключается в создании презентатора, который действует как модель, обрабатывает все входящие данные из вашей формы и распространяет их среди моделей. Таким образом, также легко создать несколько экземпляров, скажем, PreviousOwner и прикрепить его к Car.

Проверьте ссылку!

1 голос
/ 24 сентября 2011

Вы можете избежать этого и немного упростить ситуацию, представив модель автомобиля. Модель транспортного средства может иметь все ваши коллекции PreviousOwners, PreviousPlates и т. Д., А затем ваши модели грузовиков, автомобилей и мотоциклов могут иметь has_one Vehicle.

1 голос
/ 19 июля 2009

Если модели автомобилей / мотоциклов / грузовиков идентичны, вы должны добавить столбец типа к вашей модели автомобиля. Если это не так, вам следует использовать STI (наследование одной таблицы).

Но да, сначала нужно увидеть ваши модели, прежде чем я смогу дать вам код.

1 голос
/ 24 июня 2009

Существует RailsCast на сложных формах , который может помочь вам создать одну форму из нескольких моделей.

1 голос
/ 24 июня 2009

Очень хорошо, создатели вложенных форм не должны быть связаны с вложенными ресурсами AFAIK. Можете ли вы также опубликовать код модели?

...