I am trying to add a new entry in my database for a model that has a belongs_to relationship. I have 2 models, Jobs and Clients.
It was easy enough to find tutorial
You can use create_job
in this way:
client = Client.create
job = client.create_job!(subject: 'Test', description: 'blabla')
When you declare a belongs_to
association, the declaring class automatically gains five methods related to the association:
association
association=(associate)
build_association(attributes = {})
create_association(attributes = {})
create_association!(attributes = {})
In all of these methods, association is replaced with the symbol passed as the first argument to belongs_to
.
more: http://guides.rubyonrails.org/association_basics.html#belongs-to-association-reference
Just call create
on the jobs
collection of the client:
c = Client.find(1)
c.jobs.create(:subject => "Test", :description => "This is a test")
For creating new instances you could use factories. For this you could simply use FactoryGirl https://github.com/thoughtbot/factory_girl
So after you have defined your factory soewhat like this:
FactoryGirl.define do factory :job do client FactoryGirl.create(:client) subject 'Test' description 'This is a Test'
You could then call FactoryGirl.create(:job) to generate a new job like that. You could also call FactoryGirl.build(:job, client: aClientYouInstantiatedBefore, subject: 'AnotherTest') and also overwrite any other attributes
Factores are good if you want to create many objects, that are similar in a certain way.
You can pass the object as argument to create the job:
client = Client.create
job = Job.create(client_id: client.id, subject: 'Test', description: 'blabla')
The create
method will raise an error if the object is not valid to save (if you set validations like mandatory name, etc).
Pass the object itself as an argument, instead of passing its ID. That is, instead of passing :client_id => 1
or :client_id => client.id
, pass :client => client
.
client = Client.find(1)
Job.create(:client => client, :subject => "Test", :description => "This is a test")