Использование act_as_list с has_many: through в рельсах - PullRequest
5 голосов
/ 20 марта 2009

У меня есть приложение rails, которое я пытаюсь настроить с помощью сортируемых списков с помощью плагина act_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 %>

Перетаскивание работает для изменения порядка. Значение позиции обновляется в БД для объектов QuestionMembership, и на странице фактически отображается переупорядочение. Проблема в том, что при перезагрузке страницы она возвращается по умолчанию в любом порядке. Я думаю, что по умолчанию используется идентификатор вопроса для заказа вместо позиции question_membership, но я не уверен.

Любые идеи о том, как я могу сделать так, чтобы это на самом деле упорядочивалось при начальном рендеринге по полю позиции в вопросном членстве?

Ответы [ 4 ]

8 голосов
/ 23 марта 2009

Финальная версия:

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
3 голосов
/ 20 марта 2009

Как только я отправлю вопрос, я найду ответ. Мне не хватало атрибутов: order и: scope в моих моделях.

2 голосов
/ 24 июля 2010

У меня было ужасное время, решая это. До тех пор, пока я не нашел этот пример, я просто использовал act_as_list в модели «Вопрос». Это сработало бы, но Rails запутался, когда я попытался создать новые Вопросы.

Я попробовал это таким образом, и я мог создавать новые объекты, но казалось, что мое приложение не понимало, какую модель должно содержать поле "позиция".

Наконец, я понял, что в моем случае было совершенно уместно использовать только модель соединения в качестве той, на которой будет располагаться поле позиции, потому что это именно то, для чего было использовано ключевое слово: scope! Он определяет порядок «Вопросов» для каждой «Формы», , которые могут отличаться для каждой формы . После этого я просто отключил act_as_list из модели «вопрос» и занялся сортировкой на основе захвата экземпляров «QuestionMembership» (а затем с помощью их дочерних элементов для отображения данных).

Я знаю, что здесь я мало что добавляю, но мне загорелись огни, и, возможно, этот комментарий поможет кому-то еще.

1 голос
/ 20 марта 2009

С Rails 2.3 вы можете установить область по умолчанию, чтобы всегда упорядочивать по позиции:

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

Обратите внимание, что это использование области действия отличается от использования acts_as_list, который решает, к какому охвату списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...