在Rails中对深层嵌套属性进行排序

时间:2010-03-08 05:01:55

标签: ruby-on-rails nested-attributes

我希望能够拖动和拖动嵌套在Category模型下的App模型。

  

http://railscasts.com/episodes/196-nested-model-form-part-1

这是我试图关注的Railscast。

#Category controller
def move
  params[:apps].each_with_index do |id, index|
    Category.last.apps.update(['position=?', index+1], ['id=?', Category.last.id])
  end
  render :nothing => true
end

我能够用类似的东西对类别进行排序,但由于我正在更新属性,我遇到了麻烦。这就是我对“类别”列表进行排序的方式。

def sort
  params[:categories].each_with_index do |id, index|
    Category.update_all(['position=?', index+1], ['id=?', id])
  end
  render :nothing => true
end

经过进一步检查,我需要的是能够同时更新所有应用程序,除了我不能只做App.update_all,因为App是类别的属性。

我尝试使用

@category = Category.find(params[:id])
@app = @category.apps.all

但是,我没有传递类别ID,所以它不知道它是哪个类别。

这是我认为的

%ul#apps
  - for app in @category.apps
    - content_tag_for :li, app do
      %span.handle
        [drag]
    = h app.title

= sortable_element("apps", :url => move_categories_path, :handle => "handle")

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

原来这只是按位置对记录进行排序的问题。我在控制器中排序类别。因此,对于嵌套属性模型,我在模型中对它们进行了排序:

has_many :apps, :dependent => :delete_all, :order => "position"

当我移动应用程序时,只需调用

即可更新位置
App.update_all(['position=?', index+1], ['id=?', id])

然后我在模型中对它们进行相应的排序。事实证明,没有必要传递类别的ID,只需更新所有应用程序。但是,我担心它可能会慢一点,所以如果有人有更好的解决方案,我会全力以赴。

由于