我有一个辅导班和一个step班。一个教程有许多步骤,每个步骤都属于一个教程。我在我的模型和routes文件中都有这个设置。在tutorial类的show操作中,也加载了属于该教程的所有步骤。问题是,在创建了几个步骤,4-6之后,它们会变得无序。例如,加载的第一个步骤是步骤7,但之后的步骤是按顺序进行的。我使用postgresql作为数据库,并将pg gem包含在我的gemfile中。教程模型:
class Tutorial < ActiveRecord::Base
attr_accessible :name, :summary, :permalink
has_many :steps
validates :name, :presence => true,
:length => { :maximum => 50 },
:uniqueness => { :case_sensitive => false }
validates :summary, :presence => true,
:length => { :maximum => 2000 }
before_create :set_up_permalink
def to_param
permalink
end
private
def set_up_permalink
permalink = self.name.gsub(' ', '-').gsub(/[^a-zA-Z0-9\_\-\.]/, '')
self.permalink = permalink
endStep模型:
class Step < ActiveRecord::Base
attr_accessible :tutorial_id, :body, :position
belongs_to :tutorial
validates :body, :presence => true
before_create :assign_position
private
def assign_position
@tutorial = self.tutorial
@position = @tutorial.steps.size
@position = @position + 1
self.position = @position
end
end路由:
resources :tutorials do
resources :steps
end
def show
@tutorial = Tutorial.find_by_permalink(params[:id])
@steps = @tutorial.steps
@next = @steps[0]
@title = "#{@tutorial.name} - A Ruby on Rails tutorial"
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @tutorial }
end
end教程显示视图
<%= render :partial => @tutorial.steps %>发布于 2011-10-13 11:46:31
您在哪里设置顺序?你可以这样做:
@steps = @tutorial.steps.order('position')或者甚至更好,因为我想不出任何情况下你会想要步骤乱序:
在步骤模型中:
default_scope order('position')或者,您可以在关联定义上定义顺序:
在教程模型中:
has_many :steps, :order => 'position'编辑,对于地狱,这里有一个更简洁的方法来编写你的assign_position方法:
def assign_position
self.position = tutorial.steps.size + 1
end发布于 2011-10-13 16:25:42
如果可以任意添加和删除步骤,则分配位置的逻辑是有缺陷的。
例如。
H19现在有三个步骤,但它们的位置是1,3,3。这是不对的!H210<代码>F211
我会考虑几种方法来纠正这种情况:
第一条路
您可以保留用于将位置分配给新步骤的代码,但是当从教程中删除某个步骤时,会更新位置以确保它们是连续的。这是一个如何工作的草图。
class Tutorial
def rectify_step_positions
# reassign positions so that all the steps form a sequence
# E.g. step positions [1,3,4] become [1,2,3]
end
end
class Step
after_destroy :trigger_rectify_positions
def trigger_rectify_positions
tutorial.rectify_step_positions
end
endSecond way
创建新步骤时,可以将其位置指定为比所有现有步骤中的最大位置大1。
def assign_position
self.position = tutorial.steps.order("position DESC").first.position + 1
end这种方法比第一种方法更容易实现。当然,现在位置没有太多意义,因为它们不一定是连续的。位置为10的步骤可能是本教程的第二步。
结论
一旦你解决了你的位置问题,然后你可以简单地排序步骤。Bricker已经展示了几种方法来做到这一点。就个人而言,我喜欢has_many :steps, :order => 'position'
https://stackoverflow.com/questions/7749154
复制相似问题