Ruby on rails:使用belongs_to关联创建模型条目

时间:2013-04-29 19:44:44

标签: ruby-on-rails ruby ruby-on-rails-3 associations

我正在尝试在数据库中为具有belongs_to关系的模型添加新条目。我有两个模型,乔布斯和客户。

很容易找到关于如何在这两者之间建立关联的教程(使用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

5 个答案:

答案 0 :(得分:15)

只需在客户的create集合上调用jobs

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

答案 1 :(得分:4)

您可以将对象作为参数传递以创建作业:

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

如果对象无效保存(如果设置强制名称等验证),create方法将引发错误。

答案 2 :(得分:2)

将对象本身作为参数传递,而不是传递其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")

答案 3 :(得分:0)

您可以这样使用create_job

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

当您声明belongs_to关联时,声明类会自动获得与该关联相关的五种方法:

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

答案 4 :(得分:-4)

要创建新实例,您可以使用工厂。为此,您只需使用FactoryGirl https://github.com/thoughtbot/factory_girl

即可

所以,在你定义了你的工厂后,就像这样:

FactoryGirl.define做   工厂:工作做     客户端FactoryGirl.create(:客户端)     主题'测试'     描述'这是一个测试'

然后你可以调用FactoryGirl.create(:job)来生成这样的新工作。 你也可以调用FactoryGirl.build(:job,client:aClientYouInstantiatedBefore,subject:'AnotherTest')并覆盖任何其他属性

如果您想创建许多以某种方式相似的对象,Factores就很好。