14

我正在尝试在我的数据库中为具有 belongs_to 关系的模型添加一个新条目。我有 2 个模型,工作和客户。

很容易找到关于如何在这两者之间建立关联的教程(使用 has_many 和 belongs_to),但我似乎找不到任何实际使用关联的示例。

在我的代码中,我正在尝试为第一个客户创建一个新工作。Jobs 模型有一个 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

只需调用客户端createjobs集合:

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 回答
3

你可以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

于 2017-08-23T09:56:51.847 回答
-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 回答