首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套资源被无序加载

嵌套资源被无序加载
EN

Stack Overflow用户
提问于 2011-10-13 11:29:34
回答 2查看 352关注 0票数 1

我有一个辅导班和一个step班。一个教程有许多步骤,每个步骤都属于一个教程。我在我的模型和routes文件中都有这个设置。在tutorial类的show操作中,也加载了属于该教程的所有步骤。问题是,在创建了几个步骤,4-6之后,它们会变得无序。例如,加载的第一个步骤是步骤7,但之后的步骤是按顺序进行的。我使用postgresql作为数据库,并将pg gem包含在我的gemfile中。教程模型:

代码语言:javascript
复制
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
end

Step模型:

代码语言:javascript
复制
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

路由:

代码语言:javascript
复制
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

教程显示视图

代码语言:javascript
复制
<%= render :partial => @tutorial.steps %>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-13 11:46:31

您在哪里设置顺序?你可以这样做:

代码语言:javascript
复制
@steps = @tutorial.steps.order('position')

或者甚至更好,因为我想不出任何情况下你会想要步骤乱序:

在步骤模型中:

代码语言:javascript
复制
default_scope order('position')

或者,您可以在关联定义上定义顺序:

在教程模型中:

代码语言:javascript
复制
has_many :steps, :order => 'position'

编辑,对于地狱,这里有一个更简洁的方法来编写你的assign_position方法:

代码语言:javascript
复制
  def assign_position
    self.position = tutorial.steps.size + 1
  end
票数 3
EN

Stack Overflow用户

发布于 2011-10-13 16:25:42

如果可以任意添加和删除步骤,则分配位置的逻辑是有缺陷的。

例如。

  • 我创建了一个教程和3个步骤,位置为1, 2 ,3。
  • 然后我删除位置为2的步骤。
  • 现在剩下2个步骤,位置为1,3。
  • 以后我创建另一个步骤,分配位置3。

H19现在有三个步骤,但它们的位置是1,3,3。这是不对的!H210<代码>F211

我会考虑几种方法来纠正这种情况:

第一条路

您可以保留用于将位置分配给新步骤的代码,但是当从教程中删除某个步骤时,会更新位置以确保它们是连续的。这是一个如何工作的草图。

代码语言:javascript
复制
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
end

Second way

创建新步骤时,可以将其位置指定为比所有现有步骤中的最大位置大1。

代码语言:javascript
复制
def assign_position
  self.position = tutorial.steps.order("position DESC").first.position + 1
end

这种方法比第一种方法更容易实现。当然,现在位置没有太多意义,因为它们不一定是连续的。位置为10的步骤可能是本教程的第二步。

结论

一旦你解决了你的位置问题,然后你可以简单地排序步骤。Bricker已经展示了几种方法来做到这一点。就个人而言,我喜欢has_many :steps, :order => 'position'

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7749154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档