【发布时间】:2014-10-22 09:47:02
【问题描述】:
我有一个简单的关联,比如
class Slot < ActiveRecord::Base
has_many :media_items, dependent: :destroy
end
class MediaItem < ActiveRecord::Base
belongs_to :slot
end
MediaItems 按Slot 排序,并有一个名为ordering 的字段。
并且想避免 n+1 查询,但我尝试过的没有任何效果。我已经阅读了几篇博文、railscasts 等,但是嗯..它们从不在单一模型上运行等等......
我做的是:
def update
@slot = Slot.find(params.require(:id))
media_items = @slot.media_items
par = params[:ordering_media]
# TODO: IMP remove n+1 query
par.each do |item|
item_id = item[:media_item_id]
item_order = item[:ordering]
media_items.find(item_id).update(ordering: item_order)
end
@slot.save
end
params[:ordering_media] 是一个 json 数组,带有 media_item_id 和一个整数 ordering
我试过像
@slot = Slot.includes(:media_items).find(params.require(:id)) # still n+1
@slot = Slot.find(params.require(:id)).includes(:media_items) # not working at all b/c is a Slot already
media_items = @slot.media_items.to_a # looks good but then in the array of MediaItems it is difficult to retrieve the right instance in my loop
这似乎是一件很常见的事情,所以我认为有一个简单的方法可以解决这个问题。很高兴了解它。
【问题讨论】:
-
您更喜欢哪种方法:在插槽表单中为每个媒体项目填写订单字段,或在插槽显示中拖放媒体项目?
标签: ruby-on-rails postgresql activerecord ruby-on-rails-4 eager-loading