14

属しているモデルのデータベースに新しいエントリを追加しようとしています。ジョブとクライアントの 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
4

5 に答える 5

18

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

c = Client.find(1)
c.jobs.create(:subject => "Test", :description => "This is a test")
于 2013-04-29T19:49:33.957 に答える
5

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

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

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

于 2013-04-29T19:52:10.357 に答える
3

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

client = Client.find(1)
Job.create(:client => client, :subject => "Test", :description => "This is a test")
于 2016-05-25T07:13:43.730 に答える
-4

新しいインスタンスを作成するには、ファクトリを使用できます。これには、単純に FactoryGirl https://github.com/thoughtbot/factory_girlを使用できます。

したがって、ファクトリを次のように定義した後は、次のようになります。

FactoryGirl.define do factory :job do client FactoryGirl.create(:client) subject 'Test' description 'This is a Test'

次に、そのような新しいジョブを生成するために FactoryGirl.create(:job) を呼び出すことができます。FactoryGirl.build(:job, client: aClientYouInstantiatedBefore, subject: 'AnotherTest') を呼び出して、他の属性を上書きすることもできます

特定の点で類似している多くのオブジェクトを作成する場合は、因子が適しています。

于 2013-04-29T19:48:39.287 に答える