Я создаю приложение для электронной коммерции, в котором вы можете устанавливать определенные для пользователя цены на товары. Если цена для конкретного продукта для конкретного пользователя не установлена, будет показана цена продукта по умолчанию.
Это отлично работает, но я ищу более эффективное решение, так как меня не устраивает текущее.
Таблицы:
- Пользователи
- товаров (вся информация о товаре + регулярная цена)
- цены (user_id, product_id, user_price)
Модели:
class User < ApplicationRecord
has_many :prices
end
class Product < ApplicationRecord
has_many :prices
validates :name, presence: true
def self.with_user_prices(current_user)
Product.joins(
Product.sanitize_sql_array(['LEFT OUTER JOIN prices ON prices.user_id = ?
AND products.id = prices.product_id', current_user])
).select('products.*, prices.user_price')
end
end
class Price < ApplicationRecord
belongs_to :product
belongs_to :user
end
Как получить все продукты по индивидуальным ценам в контроллере:
@products = Product.with_user_prices(current_user)
Как я отображаю их в поле зрения:
<% @products.each do |product| %>
<%= product.user_price ? product.user_price : product.regular_price %>
<% end %>
Как вы видите, я в настоящее время присоединяюсь к таблице цен, а затем в поле зрения я отображаю user_price (таблица цен), если он существует, в противном случае регулярная_причина (таблица продуктов).
Я бы хотел решить все за один запрос, сохранив только один ценовой столбец с соответствующим значением в соответствии с current_user