Проверка внешнего ключа Rails многие-ко-многим? - PullRequest
0 голосов
/ 25 сентября 2011

Вопрос новичка.Я хотел бы добавить шаг проверки в мою модель объединенной таблицы, чтобы убедиться, что объект этого типа не может быть создан без объединения двух таблиц, содержащих строки, являющиеся ссылками.Например:

class Appearance < ActiveRecord::Base
  belongs_to :dancer
  belongs_to :movie
end

class Dancer < ActiveRecord::Base
  has_many :appearances, :dependent => :destroy, :foreign_key => 'dancer_id'
  has_many :movies, :through => :appearances
end

class Movie < ActiveRecord::Base
  has_many :appearances, :dependent => :destroy, :foreign_key => 'movie_id'
  has_many :dancers, :through => :appearances
end

Как сделать так, чтобы внешний вид не мог быть создан, если строк Dancer и Movie не существует?

Спасибо, ребята!

Редактировать: ответитьномер предложения ниже:

Мне не очень повезло с этим, к сожалению.Играя с консолью (после перезагрузки), я получаю что-то вроде:

appearance = Appearance.new(:dancer_id = Dancer.all.first.id, :movie_id => Movie.all.first.id)
Movie.all.first.destroy
appearance.valid?
=> true

, тогда как я ожидаю, что ответ будет ложным, так как я только обстрелял строку Movie.

1 Ответ

0 голосов
/ 25 сентября 2011

Вы, вероятно, хотите проверить наличие, что-то вроде:

class Appearance
  belongs_to :movie, :inverse_of => :appearances
  belongs_to :dancer, :inverse_of => :appearances

  validates :movie, :dancer, :presence => true
end

class Movie
  has_many :appearances, :inverse_of => :movie, ...
end

class Dancer
  has_many :appearances, :inverse_of => :dancer, ...
end

Edit: добавлено inverse_of к ассоциациям, что может помешать действию appearance, если их dancer или movie уничтожены после загрузки (Или нет. Я не проверял это, но цель inverse_of - обеспечить лучшую обработку связей в памяти).

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