# A model inside another model creation

**URL:** <https://www.ruby-forum.com/t/a-model-inside-another-model-creation/143997>\
**Category:** Rails\
**Created:** [July 24, 2008, 3:10pm UTC](https://www.ruby-forum.com/t/a-model-inside-another-model-creation/143997 "2008-07-24T15:10:21Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![adam](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/4af34b/32.png) [@adam](https://www.ruby-forum.com/u/adam)\
**Post date:** [July 24, 2008, 3:10pm UTC](https://www.ruby-forum.com/t/a-model-inside-another-model-creation/143997/1 "2008-07-24T15:10:21Z")

</div>

I got a model relationships  
Country \<- (hm) city \<- (hm) Address

The table city has two fields (both required)  
integer :country\_id  
string :name

When creating a city the user can type a country in a country field  
\<%form\_for @city do |f| %\>  
\<%= f.label :country %\>  
\<%= f.text\_field :country %\>  
\<%= f.label :country %\>  
\<%= f.text\_field :country %\>  
\<%end%\>

Before creating i would like to find a country by its name, if the  
name wouldn’t exist then a new country would be created and it’s `id`  
(the new created ones) would be placed in country\_id (so  
self.country\_id = id) field of the new city.  
Then if it validated a new city would be saved to database.

I was trying to do this in the model but couldn’t succeed.  
My general idea was to do it with a callback like before\_create, but  
it failed.

Any ideas on this one?

---

<div class="post-metadata">

**Author:** ![adam](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/4af34b/32.png) [@adam](https://www.ruby-forum.com/u/adam)\
**Post date:** [July 24, 2008, 7:13pm UTC](https://www.ruby-forum.com/t/a-model-inside-another-model-creation/143997/2 "2008-07-24T19:13:48Z")

</div>

On Thu, Jul 24, 2008 at 8:09 AM, Adam [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> \<%= f.label :country %\>
> 
> I was trying to do this in the model but couldn’t succeed.  
> My general idea was to do it with a callback like before\_create, but  
> it failed.
> 
> Any ideas on this one?

Did you try before\_validation\_on\_create?

---

<div class="post-metadata">

**Author:** ![adam](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/4af34b/32.png) [@adam](https://www.ruby-forum.com/u/adam)\
**Post date:** [July 25, 2008, 9:17am UTC](https://www.ruby-forum.com/t/a-model-inside-another-model-creation/143997/3 "2008-07-25T09:17:11Z")

</div>

I’ve tried that one and i didn’t work.

i get a ‘undefined method `new\_record?’ for “Palestinian Territory,  
Occupied”:String’

the app trace

vendor/rails/activerecord/lib/active\_record/associations.rb:903:in  
`belongs_to_before_save_for_country' vendor/rails/activesupport/lib/active_support/callbacks.rb:173:in`send’  
vendor/rails/activesupport/lib/active\_support/callbacks.rb:173:in  
`evaluate_method' vendor/rails/activesupport/lib/active_support/callbacks.rb:161:in`call’  
vendor/rails/activesupport/lib/active\_support/callbacks.rb:93:in `run' vendor/rails/activesupport/lib/active_support/callbacks.rb:92:in`each’  
vendor/rails/activesupport/lib/active\_support/callbacks.rb:92:in  
`send' vendor/rails/activesupport/lib/active_support/callbacks.rb:92:in`run’  
vendor/rails/activesupport/lib/active\_support/callbacks.rb:272:in  
`run_callbacks' vendor/rails/activerecord/lib/active_record/callbacks.rb:298:in`callback’  
vendor/rails/activerecord/lib/active\_record/callbacks.rb:206:in  
`create_or_update' vendor/rails/activerecord/lib/active_record/base.rb:2200:in`save\_without\_validation’  
vendor/rails/activerecord/lib/active\_record/validations.rb:901:in  
`save_without_dirty' vendor/rails/activerecord/lib/active_record/dirty.rb:75:in`save\_without\_transactions’  
vendor/rails/activerecord/lib/active\_record/transactions.rb:106:in  
`save' vendor/rails/activerecord/lib/active_record/connection_adapters/ abstract/database_statements.rb:66:in`transaction’  
vendor/rails/activerecord/lib/active\_record/transactions.rb:79:in  
`transaction' vendor/rails/activerecord/lib/active_record/transactions.rb:98:in`transaction’  
vendor/rails/activerecord/lib/active\_record/transactions.rb:106:in  
`save' vendor/rails/activerecord/lib/active_record/transactions.rb:118:in`rollback\_active\_record\_state!’  
vendor/rails/activerecord/lib/active\_record/transactions.rb:106:in  
`save' app/controllers/cities_controller.rb:39:in`create’  
app/controllers/cities\_controller.rb:38:in `create’  
script\server:3

the City model

class City \< ActiveRecord::Base  
belongs\_to :country

validates\_presence\_of :name,:country  
validates\_uniqueness\_of :name

attr\_accessor :country

#here sould be all the automation happening  
def before\_validation\_on\_create  
self.country\_id = 0  
end  
end

---

<div class="post-metadata">

**Author:** ![adam](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/4af34b/32.png) [@adam](https://www.ruby-forum.com/u/adam)\
**Post date:** [July 25, 2008, 12:30pm UTC](https://www.ruby-forum.com/t/a-model-inside-another-model-creation/143997/4 "2008-07-25T12:30:45Z")

</div>

Ok so I’ve figured out some thing  
There is a problem between the belongs\_to :country  
and the attr\_accessor :country

The names should be different  
I hope from now on it’ll be a piece of cacke 😉
