gpt4 book ai didi

ruby-on-rails - STI 和 has_many 关联与 "type"列作为键

转载 作者:行者123 更新时间:2023-12-04 07:02:38 25 4
gpt4 key购买 nike

我正在使用单表继承来管理不同类型的项目。
我决定存储一些与每个项目类型相关的信息。所以我用“model_type”字段作为主键创建了新表“project_types”。主键值是“项目”表的“类型”字段的值。 问题 :当我尝试与 Project 对象 ProjectTypes 对象关联时,它总是返回 null。

>> p = Project.find(:first)
=> #<SiteDesign id: 1, type: "SiteDesign", name: "1", description: "dddd", concept: "d", client_id: 40, created_at: "2009-10-15 08:17:45", updated_at: "2009-10-15 08:17:45">
>> p.project_type
=> nil

获取与 ProjectTypes 项目关联的项目是可以的。有没有办法让它正常工作?

楷模:
class Project < ActiveRecord::Base
belongs_to :project_type, :class_name => "ProjectTypes", :foreign_key => "model_name"
end

class SiteDesign < Project
end

class TechDesign < Project
end

class ProjectTypes < ActiveRecord::Base
self.primary_key = "model_name"
has_many :projects, :class_name => "Project", :foreign_key => "type"
end

迁移:
class CreateProjectTypes < ActiveRecord::Migration
def self.up
create_table :project_types, :id => false do |t|
t.string :model_name , :null => false
t.string :name, :null => false
t.text :description

t.timestamps
end

add_index :project_types, :model_name, :unique => true


#all project types that are used.
models_names = {"SiteDesign" => "Site design",
"TechDesign" => "Tech design"}

#key for model_name and value for name
models_names.each do |key,value|
p = ProjectTypes.new();
p.model_name = key
p.name = value
p.save
end

end

def self.down
drop_table :project_types
end
end

class CreateProjects < ActiveRecord::Migration
def self.up
create_table :projects do |t|
t.string :type
t.string :name
t.text :description
t.text :concept
t.integer :client_id

t.timestamps
end
end

def self.down
drop_table :projects
end
end

最佳答案

你遇到问题并不奇怪。通过从纯粹的 STI 系统转移到您当前的系统,您将一个的部分与另一个的部分混合在一起,从而可怕地打破了您正在使用的模式。

我个人会选择类似的东西:

class Project < ActiveRecord::Base
attr_readonly(:project_type)
belongs_to :project_type
before_create :set_project_type

def set_project_type()
project_type = ProjectType.find_by_model_name(this.class)
end
end

class SiteProject < Project
end

class TechProject < Project
end

class ProjectType < ActiveRecord::Base
has_many :projects
end

与迁移:
class CreateProjectTypes < ActiveRecord::Migration
def self.up
create_table :project_types do |t|
t.string :model_name , :null => false
t.string :name, :null => false
t.text :description

t.timestamps
end

add_index :project_types, :model_name, :unique => true


#all project types that are used.
models_names = {"SiteDesign" => "Site design",
"TechDesign" => "Tech design"}

#key for model_name and value for name
models_names.each do |key,value|
p = ProjectTypes.new();
p.model_name = key
p.name = value
p.save
end

end

def self.down
drop_table :project_types
end
end

class CreateProjects < ActiveRecord::Migration
def self.up
create_table :projects do |t|
t.string :type
t.references :project_type, :null => false
t.text :description
t.text :concept
t.integer :client_id

t.timestamps
end
end

def self.down
drop_table :projects
end
end

它只是清理事情,它还有助于澄清你在做什么。您的“ProjectType”表纯粹用于额外数据,您的继承树仍然存在。我还进行了一些检查,以确保您的项目类型始终设置(并且正确,基于模型名称),并通过将属性设置为只读来阻止您在保存项目类型后更改项目类型。

关于ruby-on-rails - STI 和 has_many 关联与 "type"列作为键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1600432/

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