Получение полиморфной ассоциации для прохождения валидации - PullRequest
0 голосов
/ 06 мая 2019

У меня есть User, Profile, Buyer и Seller объекты.

class User
  has_many :profiles
end

class Profile
  belongs_to :user
  belongs_to :profileable, polymorphic: true
  validates :user, presence: true, uniqueness: { scope: :profileable_type }
end

class Buyer
  has_one :profile, as: :profileable, dependent: :destroy
  has_one :user, through: :profile # is this needed?
end

class Seller
  has_one :profile, as: :profileable, dependent: :destroy
  has_one :user, through: :profile # is this needed?
end

Я хочу иметь возможность остановить создание Buyer и Seller, еслидействительный профиль не существует.

В консоли rails в настоящее время я могу создать Buyer, создав Profile без значения user:.Следующее создаст Buyer без Profile существующего.

> Buyer.create(profile: Profile.create)

=> #<Buyer:0x00007fd44006cb80
 id: 1,
 user_id: nil,
 created_at: Mon, 06 May 2019 03:41:04 UTC +00:00,
 updated_at: Mon, 06 May 2019 03:41:04 UTC +00:00>

Я хотел бы понять, как это предотвратить.Мне нужен один из before_save или такие обратные вызовы?

1 Ответ

1 голос
/ 06 мая 2019

Согласно описанию, упомянутому в посте, вы хотите добавить проверку в полиморфном виде, поэтому просто добавьте проверку присутствия в модели, и она будет работать соответствующим образом:

class Buyer
  has_one :profile, as: :profileable, dependent: :destroy
  has_one :user, through: :profile # is this needed?

  validates :profileable, presence: true
  validates :user, presence: true
end

Вторая проверка откатит транзакциюесли пользователь не найден.

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