gpt4 book ai didi

ruby - ActiveRecord 和 has_one & has_many 的使用

转载 作者:数据小太阳 更新时间:2023-10-29 08:10:24 26 4
gpt4 key购买 nike

考虑这个简单的模型,其中一个 Project 有一个 ProjectType,自然许多 Project 可以是这种类型。

所以一个Project has_one :project_type(称为type)和一个ProjectType has_many :projects

在我的迁移中,我放置了(针对此示例进行了简化)

create_table :projects do |t|
t.string :name, :null => false
t.integer :type
end

create_table :project_types do |t|
t.string :name, :null => false
end

我的 Project 类看起来像这样(再次针对此示例进行了简化)

#!usr/bin/ruby
require 'active_record'

class Project < ActiveRecord::Base
has_one :type, :class_name => 'ProjectType'
end

我的 ProjectType 看起来像

#!usr/bin/ruby
require 'active_record'

class ProjectType < ActiveRecord::Base
has_many :projects
end

我已经编写了一个简单的单元测试来检查它是否有效

#test creation of Projects and related objects.
def test_projects_and_etc
pt = ProjectType.create(:name => 'Test PT')
project = Project.create(:name => 'Test Project', :type => pt)
assert project.type.name == 'Test PT', "Wrong Project Type Name, expected 'Test PT' but got '#{project.type.name}'."

# clean up
project.destroy
pt.destroy
end

这个测试在断言处抛出一个错误,说

ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: project_types.project_id: SELECT  "project_types".* FROM "project_types" WHERE ("project_types".project_id = 1) LIMIT 1

SQL 似乎假设 project_types 表中有一个 project_id 字段,但如果 ProjectType 可以是与许多项目相关联。我怀疑我的问题与我希望能够将 ProjectType 称为 project.type 而不是 project.project_type 有关,但我不确定如何解决这个问题。

最佳答案

您需要在项目模型上使用 belongs_to 而不是 has_one。

您还需要在项目表中添加一个 project_type_id 列。

关于ruby - ActiveRecord 和 has_one & has_many 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7264878/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com