使用acts_as_list和has_many:通过rails

时间:2009-03-20 02:35:50

标签: ruby-on-rails ruby ajax

我有一个rails应用程序我正在尝试使用acts_as_list插件设置可排序列表。数据库中的位置字段正在更新,但在呈现页面时,不会考虑订单。我想,我正在寻求帮助。

以下是我的模特......

class QuestionMembership < ActiveRecord::Base
  belongs_to :form
  belongs_to :question
  acts_as_list
end

class Form < ActiveRecord::Base
  has_many :question_memberships
  has_many :questions, :through => :question_memberships
end

class Question < ActiveRecord::Base
  has_many :question_memberships
  has_many :forms, :through => :question_memberships
  acts_as_list
end

以及给我列表的草率视图代码......

<% @form.question_memberships.each do |qm| %>
  <% q_id = "question_#{qm.id}" %>
  <li class="question" id=<%= q_id %> >
    <div style="color: #999; font-size: 8pt">
      <%=h qm.question.content %>
    </div>
  </li>
  <%= draggable_element(q_id, :revert=>true) %>
<% end %>

拖放适用于重新排序。位置值在DB中为QuestionMembership对象更新,页面实际上正确显示了重新排序。问题是在页面重新加载时,它默认返回到它的感觉顺序。我认为它默认为订单的问题ID而不是question_membership位置,但我不确定。

关于如何通过QuestionMembership的位置字段对初始渲染进行实际排序的任何想法?

4 个答案:

答案 0 :(得分:8)

最终版本:

class QuestionMembership < ActiveRecord::Base
  belongs_to :form
  belongs_to :question
  acts_as_list :scope => :form
end

class Form < ActiveRecord::Base
  has_many :question_memberships, :order => "position"
  has_many :questions, :through => :question_memberships
end

class Question < ActiveRecord::Base
  has_many :question_memberships, :order => "position"
  has_many :forms, :through => :question_memberships
  acts_as_list :scope => :form
end

答案 1 :(得分:3)

我发布问题后,立即找到答案。我错过了我的模型上的:order和:scope属性。

答案 2 :(得分:2)

答案 3 :(得分:1)

使用Rails 2.3,您可以将默认范围设置为始终按位置排序:

acts_as_list :scope => <scope clause>
default_scope :order => :position

请注意,范围的使用方式与acts_as_list的范围不同,{{1}}决定了列表的范围。