繁体   English   中英

Rails自定义记录顺序?

[英]Rails custom order of records?

My Rails网站具有用户可以浏览的不同类别。 现在,它们通过一个简单的循环在视图中呈现,但是我希望能够从左到右选择显示它们的顺序。

这是当前代码:

<h4>Explore Listings</h4>
  <% @categories.each do |f| %>
    <p class="category-page-category"><%= link_to f.name, view_category_path(f.id) %></p>
  <% end %>

什么是完成我想做的简单解决方案?

首先,在每种情况下都应首选数据库进行本机排序(这要快得多)。 如果您的排序不依赖于已经存在的Category属性,请迁移一个新的属性,例如position:

add_column :categories, :position, :integer

并向模型添加范围:

class Category < ActiveRecord::Base
  def self.ordered default_order=nil
    return scoped if default_order.nil? or 
      not( %w(asc desc).include?(default_order.to_s) )
    order("position #{default_order}")
  end
end

然后在控制器中:

def index
  @categories = Category.ordered params[:order]
end

按照排序属性方法,您还应该确保有效定义了位置属性。 像这样:

class Category < ActiveRecord::Base
  before_create :default_position
  validates :position, 
    presence: true,
    numericality: true,
    uniqueness: true,
    on: :update

  def self.ordered default_order=nil
    return scoped if default_order.nil? or 
      not( %w(asc desc).include?(default_order.to_s) )
    order("position #{default_order}")
  end

  private
  def default_position
    self.position = self.class.maximum("position") + 1
  end
end

必须执行更改职位。
否则,如果职位从未改变,则意味着必须按类别的创建日期时间对类别进行排序。 然后,您也可以按created_at而不是排名进行排序。

我知道如何执行此操作的最简单方法是设置一个AJAX表单,该表单将传递一个order参数,该参数将由控制器处理以重新呈现该表单。 然后,您的控制器将侦听order参数并将其附加到@categories

例如,您的控制器代码可能看起来这样

def index
  @categories = Category.<some_other_scope>

  @categories = @categories.order(order_param) if order_param.present?

  respond_to do |format
    format.js { render :index }
  end
end

private

def order_param
  params.permit(:order)
end

听起来您想在显示类别之前对类别数组进行排序,对吗?

如果是这样,您可以使用http://www.ruby-doc.org/core-2.1.2/Enumerable.html#method-i-sort_byhttp://www.ruby-doc.org/core-2.1.2 /Enumerable.html#method-i-sort在呈现类别之前对类别进行排序。

因此,最终结果可能类似于:

 <% @categories.sort_by(&:name).each do |f| %>

假设类别具有名称字段。 这可能应该在控制器中或在具有范围的模型中完成(如果您要基于数据库字段进行排序),以使此逻辑不在视图范围之内。

看起来act_as_list正是您需要的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM