Запрос полиморфных ассоциаций, вызывающих ошибку валидности - PullRequest
0 голосов
/ 28 января 2019

В моем приложении есть полиморфная ассоциация для отслеживания заказов в моем приложении.Я хотел бы иметь возможность запросить Meal, модель, которая :orderable, но по какой-то причине после добавления ассоциации вызовы :valid? выдают ошибку.

class Order < ApplicationRecord
  belongs_to :order_status
  belongs_to :client
  has_many :order_items
  has_many :orderables, through: :order_items, source: :orderable, source_type: 'Meal'
end

class OrderItem < ApplicationRecord
  belongs_to :order
  belongs_to :meal, -> { where( order_items: { orderable_type: 'Meal' } ).includes(:meal) }, foreign_key: 'orderable_id'

  belongs_to :orderable, polymorphic: true

  validates :quantity, presence: true, numericality: { only_integer: true, greater_than: 0 }
  validate :order_present
  validate :item_present

  scope :are_veggies, -> { includes( :meal ).where( :meals => { type_of: 'veggie' }) }
  scope :are_meals, -> { includes( :meal ).where.not( :meals => { type_of: 'veggie' }) }

    private

  def item_present
    if orderable.present? and !orderable.active
      errors.add(:orderable, "Selected item is not available.")
    end
  end

  def order_present
    if order.nil?
      errors.add(:order, "is not a valid order.")
    end
  end
end

class Meal < ApplicationRecord
    extend FriendlyId
    friendly_id :name, use: :slugged

    has_many :tags, as: :taggable
    has_many :order_items, as: :orderable

    validates_presence_of :name, :type_of

    default_scope { where(active: true) }
end

Все запросыработать правильно, я могу позвонить Order.find(x).meals.Я могу позвонить Order.find(x).order_items.are_meals.

Но когда я пытаюсь позвонить OrderItem.find(x).valid?, я вижу ошибку: ActiveRecord::ConfigurationError: Can't join 'Meal' to association named 'meal'; perhaps you misspelled it?.Есть идеи, что вызывает это?

1 Ответ

0 голосов
/ 28 января 2019

Я указывал не ту модель:

# This
belongs_to :meal, -> { where( order_items: { orderable_type: 'Meal' } ).includes(:meal) }, foreign_key: 'orderable_id'

# Should have been
belongs_to :meal, -> { where( order_items: { orderable_type: 'Meal' } ).includes(:order_items) }, foreign_key: 'orderable_id'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...