试图在两个预先存在的模型之间建立一对一的关系

时间:2014-04-20 05:04:57

标签: ruby-on-rails ruby ruby-on-rails-4

我是rails的新手,我正在尝试在rails中的两个预先存在的模型(test和test_type)之间建立一对一的关系。

这是我的工作流程。

has_one :test_type - to tests model
belongs_to :test - to test_types model
rails g migration Add_Test_Type_To_Test test_type:references 
rake db:migrate 

现在看起来它已经运行正常,但是当我尝试验证它看起来没有时。

rails console
@type = TestTypes.new :name => "My Type"
@type.save
@test = Tests.new :name => "My Test"

TestTypes.find(1) //returns record ok
@test.test_type //returns nil
@test.test_type = TestTypes.find(1) //NameError: uninitialized constant Tests::TestType
@test.test_type //still nil

根据输出,它在数据库中找到我的类型,但它似乎无法将它添加到我的测试类中,这表明关系不起作用。

有人能说出我做错了吗?

1 个答案:

答案 0 :(得分:1)

如果您只更改一行代码belongs_to :test - >是否有效? has_one :test使其成为一对一的关系。但我认为您的错误来自于您未将 test_type 实例添加到 test 对象的 test_type 属性这一事实。因此,在发出@test.test_type请求之前,您需要添加@test.test_type = @test_type。如果您想将更改保存到数据库,那么update_attribute方法对于此目的非常有用update_attribute(name, value)@test.update_attribute('test_type', @test_type)

已更新回答:Rails Guide says

4.2.1 has_one

添加的方法

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

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

所以试试这个@test.create_test_type(test_id: test.id),那段代码可以替换我之前提到的@test.test_type的代码(抱歉,我不是Rails专家 - 还在学习)