Rails 3.1: has_many,: через сложный порядок - PullRequest
2 голосов
/ 09 января 2012

У меня есть модель заказов с line_items и продавцами.При отображении заказа я хочу сгруппировать line_items по поставщикам.

class LineItem < ActiveRecord::Base
  belongs_to :order
  belongs_to :vendor
end

class Order < ActiveRecord::Base
  has_many :line_items
  has_many :vendors, :through => :line_items
end

class Vendor < ActiveRecord::Base
  has_many :line_items
end

Я хочу отобразить отсортированный список поставщиков и позиций:

You have placed an order for the following items:

  Vendor 1
    Line item 1
    Line item 2
    Line item 3

  Vendor 2
    Line Item 4
    Line Item 5

  ...

Моя текущая мысль

order.vendors.each do |a_vendor|
  a_vendor.name
  !!?? AND THEN WHAT GOES HERE ??!!
end

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

Если у заказа есть только один поставщик, то я хочу показать только одного поставщика.

Ответы [ 2 ]

5 голосов
/ 09 января 2012

Как насчет этого:

<% @order.line_items.all.group_by{|i| i.vendor}.each do |vendor, items| %>
  <%= content_tag :h2, vendor.id %>
  <ul>
  <% items.each do |i| %>
       <%= content_tag :li, i.id %>
  <% end %>
  </ul>
<% end %>

[редактирование]

sort_by (&: vendor) совпадает с sort_by {| v | v.vendor}, но синтаксис блочного стиля дает вам немного больше гибкости. Например, вы можете отсортировать по имени поставщика в контроллере с помощью:

@sorted = @order.line_items.all.group_by(&:vendor).sort_by{|vendor, items| vendor.name}

Тогда в поле зрения:

<% @sorted.each do |vendor, items| %>
  <%= content_tag :h2, vendor.name %>
  <ul>
  <% items.each do |i| %>
       <%= content_tag :li, i.id %>
  <% end %>
  </ul>
<% end %>
1 голос
/ 10 января 2012

Кроме того, можно отсортировать модель, добавив фрагмент SQL к опции: order ассоциации has_many.

(см .: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many)

class Order < ActiveRecord::Base
  has_many :line_items, :order => "item_number"
  has_many :vendors, :through => :line_items, :order => "name"
end

Тогда ваш взгляд очень прост:

<% @order.vendors.each do |vendor| %>
  <h3><%= vendor.name %></h3>
  <ul>
    <% vendor.line_items.where(:order_id=>@order.id).each do |item| %>
      <li><%= item.description %></li>
    <% end -%>
  </ul>
<% end -%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...