Этот вопрос касается трех моделей:
Продажа
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
, но я не уверен, чтоэто лучший шаблон.
Обновление
Предыдущее решение, которое я выложил, привело к некоторым недостаткам и неудачным тестам.Я наконец понял это, но скоро опубликую реальное решение.