我是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
根据输出,它在数据库中找到我的类型,但它似乎无法将它添加到我的测试类中,这表明关系不起作用。
有人能说出我做错了吗?
答案 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专家 - 还在学习)