ruby-on-rails - 给每个 Post 实例一个自定义的订单位置

标签 ruby-on-rails ruby

我有一个 Post 模型。

我想在“逐个邮寄”的基础上指定他们的订单。

我假设 position:integer 属性是一个好的开始。

这是一个使用 Post.order(position: :asc) 呈现的示例:

id: 3, position: 1
id: 2, position: 2
id: 8, position: 3
...

但是更新过程将如何完成呢?或者任何其他更好的想法?

最佳答案

我假设您已经为所有记录设置了 position 属性。顺便说一句,你应该确保它不能为零:

change_column :posts, :position, :integer, null: false

假设您有一个 Post 当前是第 9 个帖子,需要成为第 5 个帖子。

首先,您需要暂时从职位列表中“删除”帖子。所有位置为 10 及更高的帖子都需要减一:

Post.where('position > ?', 9).update_all('position = position - 1')

然后你需要把它放回位置列表。这是通过从当前第五个位置开始递增所有位置来完成的:

Post.where('position >= ?', 5).update_all('position = position + 1')

整个过程涉及两个数据库查询,您不会将大量 ActiveRecord 对象加载到内存中。

您可以像这样将其设为 before_update 回调:

class Post
  before_create :update_positions
  before_update :update_positions, if: :position_changed?

  def update_positions
    if position_was
      Post.where('position > ?', position_was).update_all('position = position - 1')
    end
    Post.where('position >= ?' position).update_all('position = position + 1')
  end
end

最明显的最后一部分是在显示帖子时按位置排序:

Post.all.order(:position)

关于ruby-on-rails - 给每个 Post 实例一个自定义的订单位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21072927/

相关文章:

ruby-on-rails - 在 Rake 权限被拒绝的情况下移动文件

ruby-on-rails - Rails 4.1.1 w/pg_search - "PG::SyntaxError: ERROR: syntax error at or near "AS""Bug

javascript - 从 ruby​​ 访问 Javascript 变量

ruby - 提交时生成文档

ruby - 如何制作 Rack session cookie httponly?

java - ActiveResource 的基本假设端点是什么?

ruby-on-rails - rails : is there a way to add associations via the command line?

ruby-on-rails - 在 Rails 5 中,如何返回两个作用域的联合或将它们合并为一个?

ruby-on-rails - Rails 3 和 ActiveAdmin。过滤器显示对象而不是公司名称

ruby - 如何使用 ruby​​wmq gem 将消息发布到 IBM WebsphereMQ TOPIC