Rails активные записи отношений - PullRequest
0 голосов
/ 04 декабря 2018

Это следует из этого вопроса ( Как можно, чтобы два столбца в одной таблице указывали на один и тот же столбец в другом с ActiveRecord? ), но есть немного другой нюанс.

Iиметь модель Order, в которой есть три столбца, указывающих на одну и ту же таблицу Estimate: estimate_id, finalized_estimate_id, cost_price_estimate_id.

class Order < ApplicationRecord
  belongs_to :estimate
  belongs_to :finalized_estimate, class_name: "Estimate", optional: true
  belongs_to :cost_price_estimate, class_name: "Estimate", optional: true
end

Как будет выглядеть класс оценки?А во-вторых, может ли оценка знать, из какого столбца она?Т.е. будет / может ли оценочная модель знать, что это finalized_estimate, cost_price_estimate или просто estimate?

(оценка всегда будет только have_one заказ)

1 Ответ

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

Просто сделайте следующее,

class Order < ApplicationRecord
  belongs_to :estimate # default foreign_key is estimate_id
  belongs_to :finalized_estimate, class_name: "Estimate", foreign_key: 'finalized_estimate_id', optional: true
  belongs_to :cost_price_estimate, class_name: "Estimate", foreign_key: 'cost_price_estimate_id', optional: true
end

Отдых в порядке.:)

Объяснение:

Рельсы предпочитают соглашение по конфигурации (COC) т.е.

Когда вы пишете finalized_estimate,Он ищет модель FinalizedEstimate вместо Estimate по соглашению и ищет finalized_estimate_id, поэтому вы должны предоставить ее явно.

Для belongs_to :estimate, он получает класс Estimate & foreign_key estimate_id неявно.

С другой стороны,

class Estimate < ApplicationRecord
  has_many :orders
  has_many :finalized_order, class_name: "Order", foreign_key: 'finalized_estimate_id'
  has_many :cost_price_order, class_name: "Order", foreign_key: 'cost_price_estimate_id'
end

Здесь первичный ключ всегда присутствует в таблице orders как id

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