5

这是我在控制器中的功能:

def sort
  params[:state].each_with_index do |id, index|
    State.update_all({:position => index+1, :country_id => params[:country_id]}, {:id => id})
  end
  render :nothing => true
end

这是我的输出:

Started POST "/countries/83/states/sort" for 127.0.0.1 at Thu Apr 19 00:02:56 +0800 2012
  Processing by StatesController#sort as JS
  Parameters: {"country_id"=>"83", "state"=>["378", "381", "380"]}

ApplicationController::current_user_session
  Country Load (0.3ms)  SELECT `countries`.* FROM `countries` WHERE `countries`.`id` = 83 LIMIT 1
  SQL (1.0ms)  UPDATE `states` SET `country_id` = '83', `position` = 1 WHERE `states`.`id` = 378
  SQL (1.4ms)  UPDATE `states` SET `country_id` = '83', `position` = 2 WHERE `states`.`id` = 381
  SQL (0.9ms)  UPDATE `states` SET `country_id` = '83', `position` = 3 WHERE `states`.`id` = 380
  SQL (0.6ms)  UPDATE `countries` SET `updated_at` = '2012-04-19 00:02:56' WHERE `countries`.`id` = 83
Rendered text template (0.0ms)
Completed 200 OK in 559ms (Views: 13.0ms | ActiveRecord: 39.3ms | Sphinx: 0.0ms)

显然,以上内容并不能在一个查询中运行,因为我无法让索引加速。

我想要做的是在一个查询中运行它indexposition应该总是从id 数组的1排列开始[378, 381, 380]

简而言之:上面的结果是正确的,但我想在一个查询中运行它。

注意:它必须是通用 SQL,它必须在 MySQL 和 Postgres 中都可以工作。因为我认为FIND_IN_SET在 MySQL 中有效,而不是在 Postgres 中。

4

2 回答 2

0

您是否尝试根据:position属性对模型对象列表进行排序?

如果是这样,我建议使用链表方法可能会更好。使用Resort gem可以很容易地做到这一点。它还包含一些非常有用的辅助方法:

Product.first_in_order # returns the first ordered product.
Product.last_in_order # returns the last ordered product.
Product.ordered # returns all products ordered as an Array, not a Relation!

除非我误解了你要做什么……</p>

于 2012-04-20T16:05:30.790 回答
0

不知道它会有多大帮助,但我使用以下代码让这个插件工作,模型排序是 Step

宝石文件

# Use jquery-ui
gem 'jquery-ui-rails', '~> 5.0', '>= 5.0.5'

在 application.js 中需要

//= require jquery_ujs

查看:(我使用了一个表格,但 ul 也可以在表格正文中添加:

<tbody id="steps" data-update-url="<%= sort_course_steps_url %>">

对于每个表行添加:

<tr id="step_<%= step.id %>">

Javascript:应用可排序并发布序列化数据

jQuery(function() {
  return $('#steps').sortable({
    axis: 'y',
    update: function() {
     return $.post($(this).data('update-url'), $(this).sortable('serialize'));
    }
  });
});

路线

resources :steps do
    collection {post :sort}
end

控制器:

def sort
  params[:step].each_with_index do |id, index|
    Step.where(id:id).update_all(order: index+1)
  end
  render nothing: true
end
于 2016-10-28T15:17:03.470 回答