2013-04-29 9 views
9

belongs_to関係を持つモデルのデータベースに新しいエントリを追加しようとしています。私は2つのモデル、ジョブとクライアントを持っています。ruby​​ on rails:belongs_toアソシエーションを使用してモデルエントリを作成する

(has_manyとbelongs_toを使用して)これらの2つの間の関連付けを設定する方法に関するチュートリアルを見つけるのは簡単ですが、実際に関連が使用されている例は見つかりません。

私のコードでは、最初のクライアントのために新しいジョブを作成しようとしています。ジョブモデルにはclient_idの属性がありますが、おそらく属性を手動で入力するだけで済みますが、簡単にこれを達成するにはルビコンベンションが必要です。

Job.create(:client_id => 1, :subject => "Test", :description => "This is a test") 

私は簡単にそれを自分のコードに入れることができますが、これを行うにはルビーのほうが良い方法があります。私のモデルがセットアップされる方法はここにあります

class Job < ActiveRecord::Base 
    attr_accessible :actual_time, :assigned_at, :client_id, :completed_at, :estimated_time, :location, :responded_at, :runner_id, :status, :subject, :description 
    belongs_to :client 
end 

class Client < User 
    has_many :jobs 
end 

class User < ActiveRecord::Base 
    attr_accessible :name, :cell, :email, :pref 

end 
+0

'クライアント= Client.new。 Job.create(:client => client、:subject => "Test"、:description => "これはテストです)" – tessi

答えて

12

ただ、クライアントのjobsコレクションにcreateを呼び出す:あなたはジョブを作成するためにオブジェクトを引数として渡すことができ

c = Client.find(1) 
c.jobs.create(:subject => "Test", :description => "This is a test") 
+1

id = 1のエントリがない場合は、ActiveRecord :: RecordNotFoundを発生させます。 'Client.find(:first)'または 'Client.first'を使用します。 – MrYoshiji

+3

@MrYoshijiは通常例外を発生させますレールの 'RecordNotFound'例外は例外アプリケーションで404要求に変換されるためです。 – alf

+0

私はこの解決策が一番好きです。 – user2158382

-3

新しいインスタンスを作成するには、工場を使うことができます。

FactoryGirl.define行う 工場::ジョブ行う クライアントFactoryGirl.create(クライアント) 被験者のテスト 'あなたは、このようなあなたの工場soewhatを定義したので、後にこのためには、単にFactoryGirl https://github.com/thoughtbot/factory_girl

を使用することができます の説明 'これはテストです'

FactoryGirl.create(:job)を呼び出して、そのような新しいジョブを生成することができます。 (「AnotherTest」:aClientYouInstantiatedBefore、件名:仕事、クライアント)と、特定の方法で、似ていますが、多くのオブジェクトを作成する場合は

的因子が良好である任意の他の属性を、上書き またFactoryGirl.buildを呼び出すことができます。

+1

彼の質問では、スペックのためにそれをしたいと言いませんでした。 – kiddorails

+0

あなたはそれが間違っている開発のための工場の女の子を使用している場合は、仕様やテストでのみどこでも工場を使用することができます – MentholBonbon

+6

。 – Senjai

1

client = Client.create 
job = Job.create(client_id: client.id, subject: 'Test', description: 'blabla') 

場合create方法は、エラーが発生しますオブジェクトが保存に有効でない(必須名などの検証を設定した場合など)。

+0

これは、 'client'が' attribute_accessible'としてマークされている場合にのみ有効です。 – alf

+0

が修正されました。@alfonso – MrYoshiji

+0

のコメントもありがとうございます。 – user2158382

1

IDを渡すのではなく、オブジェクト自体を引数として渡します。つまり、:client_id => 1または:client_id => client.idを渡す代わりに、:client => clientを渡します。

client = Client.find(1) 
Job.create(:client => client, :subject => "Test", :description => "This is a test") 
0

あなたはこの方法でcreate_jobを使用することができます。すべてにおいて

association 
association=(associate) 
build_association(attributes = {}) 
create_association(attributes = {}) 
create_association!(attributes = {}) 

:あなたはbelongs_to関連付けを宣言するとき

client = Client.create 
job = client.create_job!(subject: 'Test', description: 'blabla') 

、宣言するクラスは自動的に組合に関連する5つの方法を獲得これらのメソッドのうち、アソシエーションは、belongs_toの最初の引数として渡されたシンボルに置き換えられます。

より:http://guides.rubyonrails.org/association_basics.html#belongs-to-association-reference

関連する問題