Rails: запрос активных записей для входа в диапазон и включен в - PullRequest
0 голосов
/ 17 декабря 2018

Я работаю над реализацией доставки для процесса оформления заказа.

В моем приложении есть тележки, cart_items, заказы и order_items.

Вес и размер всех предметов есть в базе данных, и я вычисляю total_weight для моделей заказа и корзины.У меня также есть модель shipping_service с weightmin и weightmax для каждой службы доставки + модель почтовой зоны и страны (страны).

Теперь я хотел бы показать на странице корзины только те службы доставки, которые соответствуютвес корзины или заказа.

Полагаю, мой carts_controller должен выглядеть примерно так:

class CartsController < ApplicationController
def show
    @cart = Cart.find(params[:id])
    @lands = Land.find(:all)
    @shippingservices = Shippingservice.where('@cart.total_weight BETWEEN ? AND ?', :weightmin, :weightmax)
end

Моя модель корзины:

class Cart < ActiveRecord::Base
  attr_accessor :total_weight

  has_many :cart_items
  has_many :products, :through => :cart_items
  has_many :lands
  has_many :shipping_services, :through => :postzones

  def total_weight
    cart_items.inject(0) {|sum, n| n.weight * n.amount + sum}
  end
end

Моя модель земли

class Land < ActiveRecord::Base
  has_many :shippingservices, :through => :postzones
  has_many :postzones
  has_many :carts
end

Моя модель shipping_service:

class Shippingservice < ActiveRecord::Base
  has_many :lands, :through => :postzones
  has_many :postzones
  has_many :carts
  has_many :orders
end

Моя модель postzone:

class Postzone < ActiveRecord::Base
  belongs_to :shippingservice
  belongs_to :land
end

Таблица postzone содержит внешние ключи для земель и shipping_services.

Позже я хотел бы реализовать два поля селектора: одно для ship_to_countries и одно для shipping_services, причем второй селектор заполняется только записями, относящимися к записи, выбранной в первом селекторе.

У меня уже было эторабота внутри carts_controller:

@shippingservices = Shippingservice.includes(:lands, :postzones).where('postzones.land_id = ?', Land.first.id) 

, который загружает во второй селектор только службы доставки для определенной страны.Но я не знаю, как объединить два предложения where относительно веса и постзоны в один запрос.

Любая помощь очень ценится!

Заранее спасибо.

1 Ответ

0 голосов
/ 17 декабря 2018

Метод total_weight - это метод ruby, который определен в модели Cart

Тогда вы не можете вызвать этот метод в операторе SQL.

Вам необходимо вычислить суммувес в выражении SQL.

Вы должны попробовать что-то вроде

@shippingservices = Shippingservice.joins(carts: :cart_items).where(
  '(cart_items.weight * cart_items.amount) BETWEEN ? AND ?', :weightmin, :weightmax
)

Я не пробовал, но я думаю, что это должно работать:)

...