Rails 3.1: кажется, что создание объектов через .build конфликтует с validates_presence_of - PullRequest
0 голосов
/ 17 декабря 2011

У меня проблемы с комбинированием проверки поля внешнего ключа и использованием метода .build для создания объектов.См. Классы ниже.

class Parent < ActiveRecord::Base
  belongs_to :family
  has_one    :family_user
  validates_presence_of  :name
  validates_associated   :family 
  validates_presence_of  :family_id
end

class Family < ActiveRecord::Base
  belongs_to  :organization
  has_many    :parents
  ...
end

Обычно это работает нормально, но в приложении я хочу использовать метод сборки.Например, следующий код как в спецификации, так и в консоли rails завершается сбоем, поскольку он ищет family_id в родительской записи.

  fam = Family.new(:organization_id => 1)
  fam.children.build(:name => "Billy Jones")
  fam.parents.build(:name => "Mister Jones")
  fam.save!  

Без validates_presence_of :family_id этот код работает, и действительно, family_idправильно записано.

Вопрос: есть ли способ проверить, что family_id действительно записан, и в то же время иметь возможность использовать .build?

Для справки, ошибка в консоли:

ruby-1.9.2-p290 :082 > fam = Family.new(:organization_id => 1)
 => #<Family id: nil, organization_id: 1, created_at: nil, updated_at: nil, url_token: nil> 
ruby-1.9.2-p290 :083 > fam.children.build(:name => "Billy Jones")
 => #<Child id: nil, family_id: nil, name: "Billy Jones", gender: nil, birth_date: nil, desired_start_date: nil, application_date: nil, notes: nil, custom1: nil, custom2: nil, custom3: nil, custom4: nil, created_at: nil, updated_at: nil> 
ruby-1.9.2-p290 :084 > fam.parents.build(:name => "Mister Jones")
 => #<Parent id: nil, family_id: nil, name: "Mister Jones", address: nil, phone: nil, email: nil, notes: nil, created_at: nil, updated_at: nil> 
ruby-1.9.2-p290 :085 > fam.save!
ActiveRecord::RecordInvalid: Validation failed: Parents family can't be blank
    from /Users/business/.rvm/gems/ruby-1.9.2-p290@rails311/gems/activerecord-3.1.1/lib/active_record/validations.rb:56:in `save!'
    from /Users/business/.rvm/gems/ruby-1.9.2-p290@rails311/gems/activerecord-3.1.1/lib/active_record/attribute_methods/dirty.rb:33:in `save!'
    from /Users/business/.rvm/gems/ruby-1.9.2-p290@rails311/gems/activerecord-3.1.1/lib/active_record/transactions.rb:246:in `block in save!'
    from /Users/business/.rvm/gems/ruby-1.9.2-p290@rails311/gems/activerecord-3.1.1/lib/active_record/transactions.rb:295:in `block in with_transaction_returning_status'
    from /Users/business/.rvm/gems/ruby-1.9.2-p290@rails311/gems/activerecord-3.1.1/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction'
    from /Users/business/.rvm/gems/ruby-1.9.2-p290@rails311/gems/activerecord-3.1.1/lib/active_record/transactions.rb:208:in `transaction'
    from /Users/business/.rvm/gems/ruby-1.9.2-p290@rails311/gems/activerecord-3.1.1/lib/active_record/transactions.rb:293:in `with_transaction_returning_status'
    from /Users/business/.rvm/gems/ruby-1.9.2-p290@rails311/gems/activerecord-3.1.1/lib/active_record/transactions.rb:246:in `save!'
    from (irb):85
    from /Users/business/.rvm/gems/ruby-1.9.2-p290@rails311/gems/railties-3.1.1/lib/rails/commands/console.rb:45:in `start'
    from /Users/business/.rvm/gems/ruby-1.9.2-p290@rails311/gems/railties-3.1.1/lib/rails/commands/console.rb:8:in `start'
    from /Users/business/.rvm/gems/ruby-1.9.2-p290@rails311/gems/railties-3.1.1/lib/rails/commands.rb:40:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'
ruby-1.9.2-p290 :086 > 

Ответы [ 2 ]

0 голосов
/ 14 августа 2013

Удалите

validates_associated   :family 
validates_presence_of  :family_id

и попробуйте это

validates_presence_of  :family

Надеюсь, это поможет.

0 голосов
/ 17 декабря 2011

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

Может быть, вы можете попробовать это альтернативное решение:

http://forums.pragprog.com/forums/74/topics/732

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