Ruby on rails STI和“与”有很多联系;“类型”;列作为键
我使用单表继承来管理不同类型的项目。 我决定存储一些与每个项目类型相关的信息。所以我创建了一个新表“project\u types”,其中“model\u type”字段作为主键。主键值是“项目”表的“类型”字段的值问题:当我尝试与项目对象ProjectTypes对象关联时,它总是返回nullRuby on rails STI和“与”有很多联系;“类型”;列作为键,ruby-on-rails,single-table-inheritance,Ruby On Rails,Single Table Inheritance,我使用单表继承来管理不同类型的项目。 我决定存储一些与每个项目类型相关的信息。所以我创建了一个新表“project\u types”,其中“model\u type”字段作为主键。主键值是“项目”表的“类型”字段的值问题:当我尝试与项目对象ProjectTypes对象关联时,它总是返回null >> p = Project.find(:first) => #<SiteDesign id: 1, type: "SiteDesign", name: "1", descript
>> 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
p=Project.find(:first)
=> #
>>项目类型
=>零
获取与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项目“项目类型”,:外键=>“模型名称”
结束
类网站设计<项目
结束
课程设计<项目
结束
类ProjectTypes“Project”,:foreign\u key=>“type”
结束
迁移:
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
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
class CreateProjectTypesfalse do | t|
t、 字符串:model_name,:null=>false
t、 字符串:name,:null=>false
t、 正文:说明
t、 时间戳
结束
添加索引:项目类型,:模型名称,:唯一=>true
#使用的所有项目类型。
模型名称={“站点设计”=>“站点设计”,
“技术设计”=>“技术设计”}
#型号名称的键和名称的值
模型_名称。每个do |键、值|
p=ProjectTypes.new();
p、 型号名称=键
p、 名称=值
p、 拯救
结束
结束
def自动关闭
下拉列表:项目类型
结束
结束
类CreateProjects
难怪你会遇到问题。通过从一个纯粹的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项目
对于迁移:
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
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
class CreateProjectTypesfalse
t、 字符串:name,:null=>false
t、 正文:说明
t、 时间戳
结束
添加索引:项目类型,:模型名称,:唯一=>true
#使用的所有项目类型。
模型名称={“站点设计”=>“站点设计”,
“技术设计”=>“技术设计”}
#型号名称的键和名称的值
模型_名称。每个do |键、值|
p=ProjectTypes.new();
p、 型号名称=键
p、 名称=值
p、 拯救
结束
结束
def自动关闭
下拉列表:项目类型
结束
结束
类CreateProjectsfalse
t、 正文:说明
t、 文本:概念
t、 整数:客户端id
t、 时间戳
结束
结束
def自动关闭
下拉列表:项目
结束
结束
它不仅能把事情清理干净,还能帮助你弄清楚自己在做什么。您的“ProjectType”表纯粹用于额外数据,您的继承树仍然存在。我还进行了一些检查,以确保始终设置了项目类型(并且根据模型名称正确设置),并通过使属性为只读来阻止您在保存项目类型后更改项目类型