`
暮雨风吹
  • 浏览: 16852 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

rails acts_as_list 记录排序

 
阅读更多

acts_as_list是一个以position大小为参照进行排序的插件(rails2中被剔除,然后以插件形式出现),他提供了一系列的方法对数据库中记录进行排序位置的调整,这种变化是持久化到数据库中的(修改position值),并不是表面的排序,wice_grid自带的排序就是一种表面化的排序。acts_as_list目的是在model数据库存储中,在一对多关系中,将多端作为一个有顺序的列表来存储,并提供一些移动的方法来辅助。

1.引入插件acts_as_list,在gemfile文件中添加

#列表排序关系
gem 'acts_as_list'
2.使用scaffold生成person,department的crud。ctrl+alt+g -> scaffold
class CreatePeople < ActiveRecord::Migration
  def change
    create_table :people do |t|
      t.string :name
      t.integer :age
      t.references :department, index: true
      t.string :phone

      t.timestamps
    end
  end
end

class CreateDepartments < ActiveRecord::Migration
 def change
 create_table :departments do |t|
 t.string :name
 t.references :parent, index: true
 t.integer :lft
 t.integer :rgt
 t.integer :position
 t.text :remark

 t.timestamps
 end
 end
end
3.将position字段加入到people中。ctrl+alt+g -> migration
class AddPositionToPeople < ActiveRecord::Migration
  def change
    add_column :people, :position, :integer
  end
end
4.执行bundle install , rake命令 db:create , db:migrate

5.在model层的person.rb和department.rb中添加

class Person < ActiveRecord::Base
 belongs_to :department, class_name: 'Department'
 acts_as_list scope: :department
end

class Department < ActiveRecord::Base
 belongs_to :parent, class_name: 'Department'
 has_many :person, -> { order("position ASC") }
end
6.修改routes.rb
# You can have the root of your site routed with "root"
  root 'people#index'
7.为people表添加n条数据,其中department_id可以相同,也可以不同,添加的过程中,查看数据库people表中记录的position值发现:

在添加时不需要通过from的形式去添加(即position的值不需要手动输入并提交),但此时数据库中的position字段是有值的,我们通过表中数据可以看到,在添加人员的时候,position的字段是根据department_id来决定的。一个department_id对应着从1到n的一个存储序列。

添加的时候如果选择一个department_id,此时系统首先会去数据库查询该department_id是否在people表中被其他记录引用,如果有,查出引用该department_id最大的position值,此时添加的记录中position在最大的基础上加1.如果该department_id还没出现在people表中,则该添加的人员记录中position的值为1

修改的时候如果将department_id的值做了改变,那么数据库中的position需要改变。该条记录没修改之前的department_id对应的所有记录的position的值都减少1.该条记录对应的position值不变。修改后的department_id中,以该条记录的position为基础。大于等于该position 的值全部加1,小于的保持不变

8.在页面通过按钮的点击利用acts_as_list提供的方法对position值进行修改和排序。

9.修改views/people/index.html.erb

<h1>Listing people</h1>

<table>
  <thead>
    <tr>
      <th>ID</th>
      <th>Name</th>
      <th>Age</th>
      <th>Department</th>
      <th>Phone</th>
      <th>Position</th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>

  <tbody>
    <% @people.each do |person| %>
      <tr>
        <td><%= person.id %></td>
        <td><%= person.name %></td>
        <td><%= person.age %></td>
        <td><%= person.department %></td>
        <td><%= person.phone %></td>
        <td><%= person.position %></td>
        <td><%= link_to 'Show', person %></td>
        <td><%= link_to 'Edit', edit_person_path(person) %></td>
        <td><%= link_to 'Destroy', person, method: :delete, data: { confirm: 'Are you sure?' } %></td>

        <td><%= link_to '上移', "/people/#{person.id}/move_position/pre" %></td>
        <td><%= link_to '下移', "/people/#{person.id}/move_position/next" %></td>
        <td><%= link_to '移到顶部', "/people/#{person.id}/move_position/first" %></td>
        <td><%= link_to '移到尾部', "/people/#{person.id}/move_position/last" %></td>

      </tr>
    <% end %>
  </tbody>
</table>

<br>

<%= link_to 'New Person', new_person_path %>
10.添加路由
get 'people/:id/move_position/:type' => 'people#move_position'
resources :people
11.修改controllers/people_controller.rb
# GET /people
  # GET /people.json
  def index
    @people = Person.all.order("position asc")
  end

#为acts_as_list定义的方法
  def move_position
    person = Person.find(params[:id])
    case params[:type]
      when 'pre'
        person.move_higher
      when 'next'
        person.move_lower
      when 'first'
        person.move_to_top
      when 'last'
        person.move_to_bottom
    end
    respond_to do |format|
      @people = Person.all.order("position asc")
      format.html { render action: 'index' }
    end
  end
12.测试效果


13.acts_as_list 提供的一些方法

Methods That Change Position and Reorder List
  list_item.insert_at(2)
  list_item.move_lower will do nothing if the item is the lowest item
  list_item.move_higher will do nothing if the item is the highest item
  list_item.move_to_bottom
  list_item.move_to_top
  list_item.remove_from_list

Methods That Change Position Without Reordering List
  list_item.increment_position
  list_item.decrement_position
  list_item.set_list_position(3)

Methods That Return Attributes of the Item's List Position
  list_item.first?
  list_item.last?
  list_item.in_list?
  list_item.not_in_list?
  list_item.default_position?
  list_item.higher_item
  list_item.higher_items       will return all the items above list_item in the list (ordered by the position, ascending)
  list_item.lower_item
  list_item.lower_items        will return all the items below list_item in the list (ordered by the position, ascending)

14.更多信息更参考github中 acts_as_list

15.源代码将会在后几篇文章中上传。


分享到:
评论

相关推荐

    rails_admin_acts_as_list:rails_admin插件以对记录进行排序

    介绍插件,用于对记录进行排序(使用 gem)安装要启用rails_admin_acts_as_list,请将以下内容添加到您的Gemfile : gem 'rails_admin_acts_as_list'gem 'rails_admin' 重要提示: rails_admin_acts_as_list之前必须...

    acts_as_authenticated

    "acts_as_authenticated" 是一个经典的Ruby on Rails插件,它为Rails应用提供了用户认证功能。在Rails框架中,用户认证通常涉及验证用户身份、管理会话以及处理登录和登出等操作。acts_as_authenticated插件简化了这...

    acts_as_paranoid

    "acts_as_paranoid" 是一个在Ruby on Rails框架中常用的gem,用于处理数据库记录的软删除(soft delete)。在数据库操作中,通常我们会遇到删除数据的需求,但直接删除可能会导致数据丢失,尤其是在生产环境中。...

    用acts_as_rateable实现简单的打分功能

    在Ruby on Rails框架中,`acts_as_rateable`是一个非常实用的插件,它允许用户对模型进行评分,从而实现简单的打分功能。这个插件是Rails社区中的一个开源项目,旨在简化应用中的评分系统集成。在本篇讨论中,我们将...

    acts_as_category:想想acts_as_tree +权限

    #ActsAsCategory acts_as_category (Version 2.0 beta)acts_as_category,是acts_as插件在acts_as_tree风格的Ruby on Rails的ActiveRecord的模式,但有一些额外的功能,以及多种便捷视图助手。例子(有关实例方法和...

    acts_as_nested_set的增强版BetterNestedSet

    acts_as_nested_set是Rails社区中广泛使用的Nested Set库,而BetterNestedSet则是它的增强版,提供了更多功能和优化。本文将深入探讨BetterNestedSet的原理、用法以及相较于acts_as_nested_set的优势。 1. Nested ...

    acts_as_restful_list:就像acts_as_list一样,但很安静

    acts_as_restful_list 就像acts_as_list 一样,但不必使用非标准方法调用(如insert_at)来弄乱您的代码,acts_as_restful_list 使管理列表变得简单。 您可以像更新其他任何内容一样更新 position 属性,其余的都...

    acts_as_paranoid:ActiveRecord插件可让您隐藏和还原记录,而无需实际删除它们

    使徒行传 一个Rails插件来添加软删除。...用法安装gem: gem 'acts_as_paranoid' , '~&gt; 0.7.0' bundle install创建迁移bin/rails generate migration AddDeletedAtToParanoiac deleted_at:datetime:index启用ActsAs

    偏执狂:Rails 3、4和5的acts_as_paranoid

    偏执狂通过destroy记录时将当前时间设置为deleted_at来做到这一点,并通过对模型上所有查询的作用域进行隐藏以仅包括不包含deleted_at字段的记录来将其deleted_at 。 如果您希望实际销毁某个对象,则可以调用...

    rails_semantic_logger, Rails 语义记录器用语义记录器替换 Rails 缺省记录器.zip

    rails_semantic_logger, Rails 语义记录器用语义记录器替换 Rails 缺省记录器 Rails 语义记录器 语义记录器用语义记录器替代 Rails 缺省记录器。http://github.com/rocketjob/rails_semantic_logger文档有关完整文档...

    Api-acts_as_api.zip

    Api-acts_as_api.zip,使在rails中创建api响应变得简单和有趣,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的数据库通信。通过提取实现并将数据放弃到对象中,api简化了编程...

    actions_as_commentable:ActiveRecord acts_as_commentable插件

    gem 'acts_as_commentable' Rails gem 'acts_as_commentable' , '3.0.1' Rails gem 'acts_as_commentable' , git: 'git@github.com:jackdempsey/acts_as_commentable.git' , branch: '2.x' 生成器 Rails 3+ ...

    acts_as_liked:向任何 Active Record 模型添加类似功能

    $ rails generate acts_as_liked 并且不要忘记迁移您的数据库 $ rake db:migrate 用法 可爱的模特 将acts_as_likeable添加到任何模型,它的实例可以被其他模型喜欢。 class Post &lt; ActiveRecord :: Base ...

    acts_as_xapian:Xapian全文搜索插件,适用于Ruby on Rails

    6. **多语言支持**:Xapian支持多种语言的分词和排序,acts_as_xapian则将这一优势带入Rails应用,使得多语言网站的全文搜索成为可能。 7. **扩展性**:除了基本的搜索功能,acts_as_xapian还允许开发者通过插件...

    acts_as_commentable_with_threading:类似于acts_as_commentable; 然而,利用 awesome_nested_set 提供线程评论

    作为可评论行为(现在有评论线程(TM)!!!——在(TM)上开玩笑) 允许将线程注释添加到多个不同的模型。 与acts_as_commentable 兼容(但需要更改数据库架构) ... rails generate acts_as_commentable_with_

    acts_as_aliased:扩展 ActiveRecord

    rails generate acts_as_aliased:install rake db:migrate 这将创建一个新表aliases 。 用法 假设您有一个需要别名的模型Company ,因为公司名称有不同的版本。 使用acts_as_aliased在模型中启用别名: model ...

    acts_as_nps_rateable:Rails 4.x的一个宝石Ruby,实现了Net Promoter Score

    gem 'acts_as_nps_rateable' 如果要将此gem添加到rails 3应用程序,则应将行更改为: gem 'acts_as_nps_rateable', '=0.0.4' 然后执行: $ bundle 或将其自己安装为: $ gem install acts_as_nps_rateable 一旦...

    acts_as_shopping_cart:简单的购物车实施

    acts_as_shopping_cart 一个简单的购物车实现。 您可以找到示例应用程序。 安装 滑轨3 从0.2.0版开始,不再支持Rails 3。 如果您仍需要在Rails 3应用程序中实现此gem,请使用0-1-x分支 将其包含在您的Gemfile中 ...

    acts_as_owner.rb:Rails 的简单所有权解决方案

    Acts as owner 是 Ruby on Rails 的一个插件,它为所有者对象提供了自我查询可拥有对象的所有权的能力。 可拥有对象可以是属于所有者对象的任何对象和属于可拥有对象的任何对象。 属于拥有的可拥有的父代的任何可...

Global site tag (gtag.js) - Google Analytics