Отношение Has_one с указанным c foreign_key - PullRequest
0 голосов
/ 07 апреля 2020

В моей модели задач я хотел бы создать два отношения has_one с моделью оценщика. Для этого я добавил значение : client_pricer_id и : presta_pricer_id в свою таблицу задач. А теперь я хочу создать has_one для каждого из них

Мой код:

Файл миграции:

class AddPricerToTasks < ActiveRecord::Migration[6.0]
  def change
    add_column :tasks, :client_pricer_id, :integer, foreign_key: true
    add_column :tasks, :presta_pricer_id, :integer, foreign_key: true
  end
end

Модель задачи

  has_one :client_pricer, :class_name => 'Pricer', :foreign_key => 'client_pricer_id'
  has_one :presta_pricer, :class_name => 'Pricer', :foreign_key => 'presta_pricer_id'

Просмотр:

@task.client_pricer

Ошибка:

SQLException: нет такого столбца: pricers.presta_pricer_id

Я, конечно, забыл указать переменную в моем строка has_one. Но я не знаю, какой :)

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Вы хотите использовать belongs_to, а не has_one.

class Task < ApplicationRecord
  belongs_to :client_pricer, class_name: 'Pricer', inverse_of: :client_pricer_tasks
  belongs_to :presta_pricer, class_name: 'Pricer', inverse_of: :presta_pricer_tasks
end

class Pricer < ApplicationRecord
  has_many :client_pricer_tasks, class_name: 'Task', foreign_key: :client_pricer_id
  has_many :presta_pricer_tasks, class_name: 'Task', foreign_key: :presta_pricer_id
end

Это действительно распространенное смешение из-за сбивающей с толку семантики.

belongs_to ставит внешний ключ на это таблица моделей. has_one помещает его на другом конце.

Инверсия has_one / has_many всегда равна belongs_to. В противном случае отношения просто указывают друг на друга по кругу.

0 голосов
/ 07 апреля 2020

Я, наконец, обнаружил, что моя ошибка должна изменить has_one на own_to (потому что ключ находится в моей модели задач)

Мой код:

Модель задачи:

belongs_to :client_pricer, :class_name => 'Pricer', optional: true
belongs_to :presta_pricer, :class_name => 'Pricer', optional: true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...