Thanks for the link. I came across it yesterday as well. I just tried it 
against master. Just adding required: true has the same issue. If you use 
the suggested null: false in the migration to add a constraint on the DB 
you get an extremely ugly ActiveRecord::StatementInvalid error due to 
violating the DB constraint:

ActiveRecord::StatementInvalid: SQLite3::ConstraintException: comments.post_id 
may not be NULL: INSERT INTO "comments" DEFAULT VALUES
    ~/.gem/ruby/2.1.2/gems/sqlite3-1.3.9/lib/sqlite3/statement.rb:108:in `step'
    ~/.gem/ruby/2.1.2/gems/sqlite3-1.3.9/lib/sqlite3/statement.rb:108:in `block 
in each'
    ~/.gem/ruby/2.1.2/gems/sqlite3-1.3.9/lib/sqlite3/statement.rb:107:in `loop'
    ~/.gem/ruby/2.1.2/gems/sqlite3-1.3.9/lib/sqlite3/statement.rb:107:in `each'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb:305:in
 `to_a'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb:305:in
 `block in exec_query'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:464:in
 `block in log'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activesupport/lib/active_support/notifications/instrumenter.rb:20:in
 `instrument'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb:458:in
 `log'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/connection_adapters/sqlite3_adapter.rb:299:in
 `exec_query'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:76:in
 `exec_insert'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:103:in
 `insert'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:14:in
 `insert'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/relation.rb:66:in
 `insert'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/persistence.rb:521:in
 `_create_record'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/counter_cache.rb:139:in
 `_create_record'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/attribute_methods/dirty.rb:122:in
 `_create_record'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/callbacks.rb:306:in
 `block in _create_record'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activesupport/lib/active_support/callbacks.rb:83:in
 `run_callbacks'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/callbacks.rb:306:in
 `_create_record'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/timestamp.rb:57:in
 `_create_record'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/persistence.rb:501:in
 `create_or_update'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/callbacks.rb:302:in
 `block in create_or_update'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activesupport/lib/active_support/callbacks.rb:114:in
 `call'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activesupport/lib/active_support/callbacks.rb:114:in
 `call'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activesupport/lib/active_support/callbacks.rb:166:in
 `block in halting'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activesupport/lib/active_support/callbacks.rb:87:in
 `call'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activesupport/lib/active_support/callbacks.rb:87:in
 `run_callbacks'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/callbacks.rb:302:in
 `create_or_update'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/persistence.rb:120:in
 `save'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/validations.rb:36:in
 `save'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/attribute_methods/dirty.rb:21:in
 `save'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/transactions.rb:284:in
 `block (2 levels) in save'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/transactions.rb:345:in
 `block in with_transaction_returning_status'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:208:in
 `block in transaction'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb:188:in
 `within_new_transaction'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:208:in
 `transaction'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/transactions.rb:218:in
 `transaction'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/transactions.rb:342:in
 `with_transaction_returning_status'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/transactions.rb:284:in
 `block in save'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/transactions.rb:299:in
 `rollback_active_record_state!'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/transactions.rb:283:in
 `save'
    
~/.gem/ruby/2.1.2/bundler/gems/rails-893b7b8b0cd8/activerecord/lib/active_record/persistence.rb:34:in
 `create'

This would result in a server error instead of a possibly kicked-back error.

Hmm…I actually just tested destroying the associated object before creation 
and presence: true doesn’t actually do what the docs claim either. It 
incorrectly saved the object.

On Thursday, September 11, 2014 7:55:11 PM UTC-4, Allen Madsen wrote:

I could be wrong but I think the first feature described in this rails 
> 4.2 article solves the problem you're describing. 
>
> http://raysrashmi.com/2014/09/02/new-features-in-rails-4-2 
>
> TL;DR 
>
> You can do this: 
>
> class User < ActiveRecord::Base 
>   belongs_to :account, required: true 
>   has_one :profile, required: true 
> end 
>
> Hope that helps, 
>
> Allen Madsen 
> http://www.allenmadsen.com 
>
​

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rubyonrails-core+unsubscr...@googlegroups.com.
To post to this group, send email to rubyonrails-core@googlegroups.com.
Visit this group at http://groups.google.com/group/rubyonrails-core.
For more options, visit https://groups.google.com/d/optout.

Reply via email to