Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails STI和“与”有很多联系;“类型”;列作为键_Ruby On Rails_Single Table Inheritance - Fatal编程技术网

Ruby on rails STI和“与”有很多联系;“类型”;列作为键

Ruby 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

我使用单表继承来管理不同类型的项目。 我决定存储一些与每个项目类型相关的信息。所以我创建了一个新表“project\u types”,其中“model\u type”字段作为主键。主键值是“项目”表的“类型”字段的值问题:当我尝试与项目对象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
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”表纯粹用于额外数据,您的继承树仍然存在。我还进行了一些检查,以确保始终设置了项目类型(并且根据模型名称正确设置),并通过使属性为只读来阻止您在保存项目类型后更改项目类型