Проверить наличие внешнего ключа на связанных объектах и ​​с помощью collection.build

У меня есть следующие модели:

class Price < ActiveRecord::Base
  belongs_to :article, inverse_of: :prices
  validates :article_id, presence: true
end

class Article < ActiveRecord::Base
  has_many :prices, dependent: :destroy, inverse_of: :article
end

Код при их создании вызывает ошибку проверки при сохранении (Цены недействительны):

article = Article.new
article.prices.build( { amount: 55.0 } )
article.save! #=> Validation failed: Prices is invalid

Таким образом, Rails недостаточно умен, чтобы сохранить родительский объект (Article) перед дочерними объектами (Prices), поэтому article_id может быть присвоен цене до ее сохранения.

Как вы используете проверки внешнего ключа при использовании функции сборки?

Похоже, это довольно стандартный сценарий, который должен сработать?

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


person thejaz    schedule 13.09.2013    source источник
comment
Нельзя ли сохранить статью перед построением цен?   -  person David Aldridge    schedule 13.09.2013
comment
Да, это обходной путь. Но это кажется проблемой в Rails, так как этот рабочий процесс должен работать.   -  person thejaz    schedule 13.09.2013
comment
@depa нет, совсем другое   -  person thejaz    schedule 13.09.2013
comment
Потрудитесь объяснить, почему? Вы хотите проверить наличие связи has_many, и это точно то, что задавал вопрос, на который я ссылался.   -  person Marcelo De Polli    schedule 13.09.2013
comment
Пожалуйста, прочитайте весь вопрос. Я уже делаю валидацию, но проблема в валидации в сочетании с использованием функции сборки. И я ничего не упоминаю о проверке ассоциации has_many? У меня есть валидация на принадлежности_то, как вы можете видеть в примере.   -  person thejaz    schedule 13.09.2013
comment
Поскольку вы не заинтересованы в прояснении своего вопроса, я голосую за то, чтобы закрыть его как не по теме. Кроме того, пожалуйста, не подразумевайте, что я не читал то, что вы написали, потому что я делал это снова и снова, и это все еще не имеет смысла.   -  person Marcelo De Polli    schedule 13.09.2013
comment
Для меня это имеет смысл, поэтому голосую за него.   -  person techvineet    schedule 13.09.2013
comment
@depa Я просто думал, что ты этого не читал, потому что это было не так сложно. Я получаю ошибку проверки, но Rails должен хранить объекты в правильном порядке, чтобы избежать ошибки проверки.   -  person thejaz    schedule 13.09.2013


Ответы (1)


В Rails вы можете сделать так

class Article < ActiveRecord::Base
  has_many :prices, dependent: :destroy, inverse_of: :article
  validates_associated :prices
end

но это не 100% решение этой проблемы.

Вы можете попробовать этот гем https://github.com/perfectline/validates_existence.

person techvineet    schedule 13.09.2013
comment
Что делает validates_associated :prices, если вы говорите, что это не 100% решение? Что касается драгоценного камня, я не хочу проверять наличие фактического объекта - только если присутствует artice_id. - person thejaz; 13.09.2013
comment
Он будет проверять цены из Articles.save, но, поскольку вы ищете наличие Price#article_id, этого нельзя добиться даже с помощью этого. Подтверждение существования, как правило, дает некоторое решение для этого. - person techvineet; 13.09.2013
comment
Не заслужил голосования. Пожалуйста, используйте свое право голосовать против с умом - person techvineet; 13.09.2013
comment
На сайте написано, что вы должны нажать кнопку голосования против, когда ответ бесполезен. И ваш ответ не отвечает на вопрос, поэтому я не могу найти лучшую ситуацию, чтобы проголосовать против? Я только хочу, чтобы другие посетители знали, что это не ответ на вопрос, ничего личного. - person thejaz; 13.09.2013