I have an order
class Order < ActiveRecord::Base
has_many :order_items
end
with items
class OrderItem < ActiveRecord::Base
belongs_to :family
belongs_to :order
has_many :order_items
I sort the order items via a scope which joins with item family to
sort them accordingly
scope :default_order, joins(:family).order(‘families.name,
order_items.quantity’)
end
Controller
def edit
@order = Order.find params[:id]
@ois = @order.order_items.default_order
end
My problem is in the update method, if we have errors and must show
the order to the user…
How do I sort properly my items?
def update
…
if @order.update_attributes(params[:order])
…
else #it doesn’t validate
#if I do
@ois = @order.order_items.default_order
# items are reloaded (with the correct order) BUT user input and
validation errors are lost.
end
end
How do I keep the sorting + data?!?
- I don’t want to use a default_scope in order items because of
problems I had with it in the past and performance. - Since my sorting is made over two models, I can’t use the
basic :order on the has_many association.
I guess the best would be to be able to assign a default_scope on the
has_many association so when they are loaded implicitly (especially
during @order.update_attributes(params[:order]) the order is
consistent.
To show the pain and ugliness, I currently do this way.
@items = @order.order_items
@items = params[:order][:order_items_attributes].values.map{|v|
v[:id]}.map{|id| @items.detect{|i| i.id == id.to_i}} unless
@items.empty?
It works because the params hash keeps the sorting order…
I really hope I’m doing something wrong and there is a better way…