Цветные строки путем сопоставления ассоциаций в таблице - PullRequest
0 голосов
/ 24 июня 2019

Моя цель - иметь строки, в которых результаты цикла, имеющие соответствующие атрибуты, имеют одинаковый цвет фона

Вот моя попытка:

контроллер:

vendor_products = VendorProduct.where(vendor_id: current_user.id)
@vendor_orders = Order.where(product_id: vendor_products.map { |vp| vp.product_id}).order(created_at: :desc)

Форма: 1012 **

  <% @vendor_orders.each do |order, cart_id| %>
      <tr class="ok">
        <% if order.cart_id.present? && order.cart_id == order.cart_id %>
            <td><%= order.id %></td>
            <td><%= order.cart_id %></td>
            .....
        <% else %>
            <td><%= order.id %></td>
            <td><%= order.cart_id %></td>
            .....
        <% end %>
      </tr>
  <% end %>

(пробовал if оператор как внутри, так и снаружи <tr>)

Тип:

.ok:nth-child(odd) {
  background: red;
}

.ok:nth-child(even) {
  background: blue;
}

Моя цель состоит в том, чтобы, если cart_id ордера совпадал, тогда для количества x заказов, совпадающих с cart_id, был одинаковый цвет фона, поэтому известно, что они - одна и та же корзина.

Пример:

ID | Cart 

1  | 1 (red)

2  | 1 (red)

3  | nil

4  | 2 (blue)

5  | 2 (blue)

Итак, ID 1 и 2 будут иметь красные строки, а ID 4 и 5 - синие. 3 не имеют цвета, так как он не принадлежит ни к какой корзине. Также хотелось бы, чтобы это были только тележки с несколькими предметами.

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

так в принципе, ЕСЛИ есть cart_id заказов? и cart.line_items.count> 1, чтобы все связанные с ним заказы были одного цвета.

Модели:

**cart**

has_many :line_items, dependent: :destroy
has_one :order
...

**line items**

belongs_to :cart
...

**order**

belongs_to :cart

Моя попытка ничего не значит. Все результаты просто становятся красными.

Я отмечаю JS и JQ на всякий случай, потому что я полагаю, что это приемлемый вариант, чтобы это работало.

Ответы [ 2 ]

1 голос
/ 24 июня 2019

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

Логика контроллера очень проста:

# app/controllers/orders_controller.rb

class OrdersController < ApplicationController
  def index
    @presenter = VendorOrderPresenter.new(current_user&.id)
  end
end

Специальная логика содержится в презентаторе:

# app/presenters/vendor_order_presenter.rb

class VendorOrderPresenter
  COLORS = %w[red blue].freeze

  def initialize(current_user_id)
    @current_user_id = current_user_id
  end

  def vendor_orders
    @vendor_orders ||= Order.where(product_id: vendor_products.pluck(:product_id)).order(created_at: :desc)
  end

  def completed_orders
    @completed_orders ||= vendor_orders.where(order_status: "complete")
  end

  def background_color(order)
    index = colorable_cart_ids.index(order.cart_id)
    index ? COLORS[index % COLORS.size] : nil
  end

  private

  attr_reader :current_user_id

  def vendor_products
    VendorProduct.where(vendor_id: current_user_id)
  end

  def colorable_cart_ids
    @colorable_cart_ids ||= cart_ids.select { |id| cart_ids.count(id) > 1 }.uniq
  end

  def cart_ids
    @cart_ids ||= vendor_orders.pluck(:cart_id).compact
  end
end

Теперь слой представления прост и интуитивно понятен без условной или специализированной логики:

# app/views/orders/index.html.erb

<h1>Index</h1>
<table>
  <thead>
  <th>Order ID</th>
  <th>Cart ID</th>
  </thead>
  <tbody>
  <% @presenter.vendor_orders.each do |order| %>
    <tr style='background:<%= @presenter.background_color(order) %>'>
      <td><%= order.id %></td>
      <td><%= order.cart_id %></td>
    </tr>
  <% end %>
  </tbody>
</table>

Полное рабочее решение можно найти здесь .

0 голосов
/ 24 июня 2019

Это предложение.Я скомпилировал и служил той же цели.

в вашем контроллере извлеките идентификаторы корзины из @vendor_orders и сделайте хэш с идентификатором в качестве ключа и случайным цветом в качестве значения.

    @ids = @vendor_orders.pluck(:id)
    @ids = @ids.uniq
    @color = Hash.new
    @ids.each do |val|
        @color["#{val}"] = "##{random_hex}"
    end

гдеrandom_hex

def random_hex
    colour = "%06x" % (rand * 0xffffff)
    return colour
end

теперь, по вашему мнению, внутри цикла вызовите цвет, соответствующий cart_id от @color как

<td style='background:<%= @color["#{order.cart_id}"] %>'><%= order.cart_id %></td>

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