Что такое Rails Way для перебора многошаговых ассоциаций в представлении? - PullRequest
0 голосов
/ 05 октября 2010

У меня есть проект Rails 3 с Product.

:product has_many :product_properties
:product has_many :properties, :through => :product_properties

:product_property belongs_to :product
:product_property belongs_to :property

:property has_many :product_properties
:property belongs_to :property_type

Существует атрибут "sequence" для: property_type и: property.

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

Я знаю, что могу добавить «порядок» в отношения has_many, но это не решает мою принадлежность к сортировке, исходя из моего отношения «многие ко многим».

Причина, по которой я думаю, что мне нужно использовать хеш, заключается в том, что я хочу, чтобы мой дисплей был:

Тип недвижимости 1 ***
* Свойство 1: значение
* Свойство 2: значение
* Свойство 3: значение

Тип недвижимости 2 ***
* Свойство 4: значение
* Свойство 5: значение

Если я переберу всю коллекцию, я получу дубликаты моих типов свойств, если только я не добавлю там некрасивые сравнения «предыдущее значение» и «текущее значение».

Ответы [ 2 ]

0 голосов
/ 25 октября 2010

Вот что я в итоге сделал. Это комбинация отношений ": has_many,: through" и AREL, и она позволяет мне красиво отображать вложенные отношения без большого количества кода.

<% for pt in PropertyType.where("name not in ('Interchanges','Description')").order(:name) %>
    <% next unless pt.product_properties.where(:product_id => @product.id).first %>
    <h2><%= pt.name %></h2>
    <p>
        <% for pp in @product.product_properties.includes(:property).order("properties.name") %>
            <%= pp.property.name %>: <%= pp.value %><br />
        <% end %>
    </p>
<% end %>
0 голосов
/ 05 октября 2010

У меня есть некоторые идеи, не уверен, что они будут работать, и я все еще использую рельсы. 2.3

Идея 1 - добавьте в свои модели default_scope: order => 'sequence'

Идея 2-

Product.find (: all,: include => {: product_properties => {: properties =>: property_type}},: order => "products.sequence, property_types.sequence")

примечание: таблица не может называться property_types в запросе, но вы можете посмотреть журналы и посмотреть, какой псевдоним был предоставлен рельсами.

Последнее средство

a.sort_by {| a |a}

(не нужно создавать хеш)

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