[英]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_by或http://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.