Rails сложные вложенные формы с 3 моделями - PullRequest
1 голос
/ 22 ноября 2011

Этот вопрос касается трех моделей:

Продажа

class Sale < ActiveRecord::Base
  has_many :sale_items
  has_many :items, through :sale_items
end

Элемент

class Item < ActiveRecord::Base
  has_many :sale_items
  has_many :sales, :through => :sale_items
end

SaleItem

class SaleItem < ActiveRecord::Base
  belongs_to :sale
  belongs_to :item
end

Чтобы объяснить, item действует как базовый шаблон для sale_item.В приложении много Item с, но они не обязательно являются частью каждого Sale.Таким образом, sale_item.name фактически указывает на sale_item.item.name, а метод sale_item price выглядит следующим образом:

def price
  super || item.price
end

A sale_item либо получает свою цену от item, либоэту цену можно переопределить для этого конкретного sale_item, отредактировав ее столбец price в базе данных.

С этим у меня возникают трудности в моем представлении sales/_form.html.erb: мне нужна таблицавсе Item объекты, которые просматривают таблицу в этом Tinkerbin: http://tinkerbin.com/46T7JAKs.

Итак, это означает, что если флажок снят, а форма отправлена, необходимо создать новый SaleItemс item_id равным этому, если Item из списка, и с соответствующими полями price и quantity (quantity относится к SaleItem и не существует для Item объектов).

Кроме того, если редактируемый Sale уже содержит определенный SaleItem, этот флажок уже должен быть установлен при визуализации представления формы (поэтому снятие флажка для строки приведет к удалению SaleItemобъект, связанный с этим Item и этим Sale).

Я не уверен, как это можно сделать - возможно, я делаю это неправильно с самого начала.Я решил покончить с моделью SaleItem и создать таблицу items_sales с полями sale_id, item_id, price и quantity, но я не уверен, чтоэто лучший шаблон.


Обновление

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

Ответы [ 3 ]

1 голос
/ 22 ноября 2011

Как автор cocoon , драгоценного камня, который облегчит создание динамически вложенных форм, я хотел бы указать вам на пример проекта под названием cocoon_simple_form_demo , который содержит все видывложенные формы, включая этот тип.

Я также написал blogpost , описывающий все это.

Надеюсь, это поможет.

0 голосов
/ 22 ноября 2011

Что если вы будете обращаться с таблицей соединений больше как с обычной моделью рельсов.

class SaleItems < ActiveRecord::Migration
def change
create_table :sale_items do |t|
  t.integer :sale_id
  t.integer :item_id
  t.float :price
  t.float :quantity

  t.timestamps
   end
  end
end

Тогда вы можете делать такие вещи, как

Контроллер

@sale = Sale.new
@saleitem = @sale.SaleItem.build

Вы можете добавить элемент select для каждой строки в форме. С помощью некоторого JavaScript вы можете обновить поле цены из выбранного элемента и изменить его, если хотите.

Даже лучше, чем выбрать, посмотрите этот railscast при автоматическом завершении ассоциации (если у вас нет профессионального аккаунта на railscast (получите один!), Перейдите здесь

Для добавления строк в форму продажи взгляните на этот railscast на сложных формах

0 голосов
/ 22 ноября 2011

Вам нужен флажок с массивом, который будет содержать при отправке массив всех выбранных идентификаторов, поэтому вместо флажка html используйте помощник флажка:

<%= check_box_tag 'sale_item_ids[]', item.id -%>

При отправкехэш params будет содержать идентификаторы выбранного элемента.Теперь вам нужно выполнить цикл для каждого из них и выполнить соответствующее создание отношения (sale_item).Вы также должны зациклить те, которые уже существуют для этой продажи, и удалить их, если они не находятся в представленном массиве.

При создании фактической HTML-страницы вы можете проверить, есть ли идентификатор флажка уже в продажеи отметьте / снимите галочку соответственно.

Надеюсь, это поможет:)

...