Ассоциации Rails, Self Joins, не могут найти объект own_to при обратном вызове after_create - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть отношения has_many и belongs_to в одной и той же модели.

Из принадлежащих объекту Rails генерирует неправильный SQL для поиска родителя.

Моя модельследующим образом:

class Variant < ApplicationRecord
  enum kind: %i[main sized]
  has_many :sized_variants, -> { where kind: 'sized' }, :class_name => "Variant", :dependent => :destroy, :foreign_key => "parent_id"
  belongs_to :main_variant, -> { where kind: 'main' }, :class_name => "Variant", optional: true, :foreign_key => "parent_id"
  after_create :validate_main_variant

  def validate_main_variant
    if sized? && self.main_variant.nil?
      errors.add(:variant, 'main variant not found')
      throw :abort
    end
  end

В after_create размерного варианта при вызове self.main_variant Rails генерирует приведенный ниже SQL для поиска main_variant (внешний ключ parent_id) вместо простого поиска по parent_id.

В чем здесь ошибка или возможное решение?

Variant Load (1.2ms)
SELECT  "variants".*
FROM "variants"
WHERE "variants"."product_id" = $1
AND "variants"."color_id" = $2
AND "variants"."size_id" = $3
AND "variants"."parent_id" = $4
AND "variants"."id" = $5
AND "variants"."kind" = $6
LIMIT $7
[["product_id", 20], ["color_id", 1], ["size_id", 1], ["parent_id", 44], ["id", 44], ["kind", 0], ["LIMIT", 1]]

Я использую Rails 5.1.6.

1 Ответ

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

Извлечение из пути rails, основанного на документации rails:

7.4.1.13 foreign_key: column_name Переопределяет основанное на соглашении имя столбца внешнего ключа, которое обычно используется в операторе SQL, которыйзагружает ассоциацию.Обычно это будет имя класса записи-владельца с добавленным к нему _id.

7.4.1.15 primary_key: column_name Указывает суррогатный ключ, который следует использовать вместо первичного ключа записи-владельца, значение которого следует использовать при запросе для заполненияколлекция ассоциаций.

То, что вы сделали, похоже, говорит Active Record, как изменить соглашение об извлечении данной Variant принадлежащей ей ассоциации, но не о том, как извлечь данную Variant принадлежащую ей ассоциацию.

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