web-dev-qa-db-ja.com

Ruby on Rails:belongs_toアソシエーションを使用したモデルエントリの作成

Belongs_to関係を持つモデルのデータベースに新しいエントリを追加しようとしています。 JobsとClientsの2つのモデルがあります。

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

私のコードでは、最初のクライアント用に新しいジョブを作成しようとしています。ジョブモデルにはclient_idの属性があり、おそらく手動で属性を入力できることはわかっていますが、これを簡単に実行するには、いくつかのRuby規則が必要です。

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

これは簡単にコードに入れることができますが、Rubyの方が良い方法だと思います。これが、モデルのセットアップ方法です。

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
13
user2158382

クライアントのcreateコレクションでjobsを呼び出すだけです。

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

オブジェクトを引数として渡して、ジョブを作成できます。

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

createメソッドは、オブジェクトの保存が無効な場合(必須名などの検証を設定した場合)にエラーを発生させます。

4
MrYoshiji

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")
2
Rory O'Kane

_create_job_は次のように使用できます。

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

_belongs_to_アソシエーションを宣言すると、宣言するクラスは、アソシエーションに関連する5つのメソッドを自動的に取得します。

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

これらすべてのメソッドで、関連付けは_​​belongs_to_に最初の引数として渡された記号に置き換えられます。

詳細: http://guides.rubyonrails.org/association_basics.html#belongs-to-association-reference

1
Meysam Salehi