标签: single-table-inheritance

使用具有相同控制器的STI路径

我正在使用STI,我想知道,我是否必须为每个型号配备一个单独的控制器?我有一种情况,我只在STI关系中使用一个模型的创建和编辑操作,但如果我尝试为其执行表单,则会出现"未定义的方法"错误.更具体地说,我有两个继承自List的模型:

class RegularList < List
class OtherList < List
Run Code Online (Sandbox Code Playgroud)

我有一个处理这些操作的列表控制器,但我只使用表单创建带有RegularList的新模型.即我使用form_for创建新的List对象的唯一情况是使用RegularList.我想做的是:

class ListsController < ApplicationController

def new
  @list = RegularList.new
end
Run Code Online (Sandbox Code Playgroud)

否则创建新列表的路径看起来像regular_list/new,但我希望它只是list/new.思考?

编辑:问题是当我使用上面的代码时,我得到一个'未定义的方法'错误.我的观点如下:

...

所以在Lists控制器中使用RegularList对象似乎存在一些问题,这是我试图解决的主要问题.对不起,我意识到这不是最清楚的解释.

ruby-on-rails single-table-inheritance

2
推荐指数
1
解决办法
1063
查看次数

如何在单表继承中填充:type字段?

我之前问了一个关于如何在我正在构建的简单应用程序中构建数据以管理内容的问题.答案是看单表继承,我认为这将是票.

我已经阅读了很多例子,但似乎总是遗漏的一件事是:type type是如何实际填充的?我是否包含一个带下拉列表的表单字段,以便用户可以选择类型?

我相信我完全理解STI现在如何工作(类型字段采用类名)但我仍然缺少一些非常基本的东西(可能非常明显,但我很想念它).有人能填补我吗?

我有一个像这样的内容表:

id
type
name
desc
Run Code Online (Sandbox Code Playgroud)

不同的类型将是"网站","博客","照片".

ruby ruby-on-rails single-table-inheritance

2
推荐指数
1
解决办法
1245
查看次数

单表继承用于引用具有自己字段的子类

我正在使用Ruby on Rails 3,我实现了一个有效的单表继承,如下所示:

class User < ActiveRecord::Base

  # Schema Information
  #
  # Table name: User
  #
  # id              : integer
  # type            : string
  # children_user_id: integer

  ...
end

class UserAdmin < User

  # Schema Information
  #
  # Table name: UserAdmin
  #
  # id             : integer
  # special_field1 : string
  # special_field2 : string
  # ...

  ...
end

class UserCommon < User

  # Schema Information
  #
  # Table name: UserCommon
  #
  # id             : integer
  # another_field1 : string …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails class single-table-inheritance ruby-on-rails-3

2
推荐指数
1
解决办法
2241
查看次数

Rails:未初始化的常量PostsController :: TextPost

在我的应用程序中,我可以使用不同类型的帖子.所以我有想法为此包含单表继承:

class Post < ActiveRecord::Base
  has_many :comments
end

class TextPostValidator < ActiveModel::Validator
  def validate(record)
    if record.title.nil? and record.body.nil?
      record.errors[:base] << "Either title or body is necessary"
    end
  end
end

class TextPost < Post
  validates_with TextPostValidator
end

class ImagePost < Post
  validates :image_url, :presence => true
end

class VideoPost < Post
  validates :video_code, :presence => true
  validates :video_service, :presence => true
end

class LinkPost < Post
  validates :link_url, :presence => true
end
Run Code Online (Sandbox Code Playgroud)

当我现在这样做PostsController:

def new_text
  @post = …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails single-table-inheritance ruby-on-rails-3

2
推荐指数
1
解决办法
2万
查看次数

DataMapper - 单表继承

有人可以向我解释这里发生了什么吗?

这是一个我放在一起展示你们最新情况的例子:

class Person
  include DataMapper::Resource
  property :id, Serial
  property :type, Discriminator
  property :name, String
  property :age, Integer
end

class Male < Person
end

class Father < Male
  property :job, String
end

class Son < Male
end

class Female < Person
end

class Mother < Female
  property :favorite_song, String
end

class Daughter < Female
end

DataMapper.auto_upgrade!
Run Code Online (Sandbox Code Playgroud)

如果我打电话给Person.all我:

Person.all
=> [#<Son @id=1 @type=Son @name="Mike" @age=23 @status=nil>, 
#<Son @id=2 @type=Son @name="Carlos" @age=12 @status=nil>, 
#<Father @id=3 @type=Father @name="Robert" @age=55 @job=<not loaded>>, …
Run Code Online (Sandbox Code Playgroud)

ruby single-table-inheritance sinatra ruby-datamapper

2
推荐指数
1
解决办法
983
查看次数

在使用Devise注册后登录继承的用户

我正在使用rails 3.2.14和设计3.2.1,并且我有一个与我的设计"用户"模型具有STI关系的"管理员".

当我使用下面的表单注册一个新的管理员时,我收到以下错误:

undefined method `new_admin_session_path' for #<ActionDispatch::Routing::RoutesProxy:0x007fa6fe068f18>
Run Code Online (Sandbox Code Playgroud)

因为我有:

devise_for :users, :skip => :registrations do
Run Code Online (Sandbox Code Playgroud)

在我的路线.

如何注册新的"管理员",然后以"用户"身份登录?

请注意,如果我在我的form_for中为"用户"交换"管理员",并从我的路线中的"用户"中删除跳过注册,那么我得到我想要的行为,除了它是"用户"而不是"管理员" .

我创建了一个独立的应用程序来演示我的问题.https://github.com/deathwishdave/devise_test

user.rb

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :email, :password, :password_confirmation, :remember_me
end
Run Code Online (Sandbox Code Playgroud)

admin.rb

class Admin < User
end
Run Code Online (Sandbox Code Playgroud)

index.html.erb

<h2>Sign up</h2>

<%= form_for(Admin.new, :as => :admin, :url => registration_path(:admin)) do |f| %>
  <%= devise_error_messages! %>

  <div><%= f.label :email %><br />
  <%= f.email_field :email, :autofocus => true %></div>

  <div><%= f.label :password %><br />
  <%= …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails single-table-inheritance sti devise ruby-on-rails-3

2
推荐指数
1
解决办法
1480
查看次数

我应该为MySql中的讲师和学生制作1或2个表吗?

我目前正在开展一个项目,您可以在其中保存讲师和学生的详细信息.我不知道我是否应该使用一个表User或两个表LecturerStudent.

当您作为讲师登录时,您具有特殊权限作为项目的组管理页面,在加载学生不具备的组页面上.在Usertbl中将有一个列 status在哪里注册,您可以选择成为学生或讲师的页面并输入特殊的讲师代码.我正在使用PHP和mySql.

在摘要中,我应该User为学生和讲师使用1个表,还是有2个单独的表StudentLecturer表.

附加信息:1门课程可以有很多讲师和学生,但是1名学生将有1门课程,其中讲师有很多课程.

mysql database database-design single-table-inheritance class-table-inheritance

2
推荐指数
1
解决办法
366
查看次数

实体框架:如何使用rowversion字段为每个类继承启用一个表?

为什么我不能在子类中定义具有相同名称的成员?每个类继承一个表rowversion timestamp,每个表中都有一个字段.似乎实体设计者应该允许这样做,并使用new属性上的关键字来实现它.解决方法是什么?如果我不能使用,new如何在具有不同值的继承链中指定相同的字段?对于具有rowguids,modifiedbys,modifieddates等的其他数据库,情况可能如此.

编辑:我想这样做的逻辑方法是重命名对该字段的引用,即PersonRowversionStudent下降的类中Person.

我错过了一块可以自动跟踪这些字段的EF吗?

inheritance entity-framework single-table-inheritance

1
推荐指数
1
解决办法
1814
查看次数

当有STI时,Rails设计为注册表单添加字段

这是我的模特:

class User <  ActiveRecord::Base
  has_one :worker, :class_name => 'Worker', :foreign_key => :worker_id
  devise :database_authenticatable
  accepts_nested_attributes_for :worker
  attr_accessible  :worker_id, :email, :password, :password_confirmation, :remember_me, :workers_attributes, :worker_attributes, :name, :worker
end
class Worker < User
devise :database_authenticatable, :registerable
belongs_to :user
attr_accessible :name, :worker, :workers
end
Run Code Online (Sandbox Code Playgroud)

我正在尝试将字段名称添加到 http:// localhost:3000/workers/sign_up的注册表单中

注册表格

<h2>Create Worker</h2>
<%= form_for resource, :as => resource_name, :url => registration_path(resource_name) do |f| %>

  <%= devise_error_messages! %>
 <table summary="Subject form fields">
      <tr>
        <th>Name:</th>
        <td><%= f.text_field :name %></td>
      </tr>
         <tr>
  <th><%= f.label :email %></th>
   <td><%= …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails single-table-inheritance devise ruby-on-rails-3

1
推荐指数
1
解决办法
2881
查看次数

用TPT继承EF - 如何指定外键列名?

我想将两个派生类映射到两个表(TPT)

[Table("User")]
public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
}

[Table("Employee")]
public class Employee : User
{
    public int UserId { get; set; }
    public string DeptName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这些表已经存在(即我无法修改模式)并且定义如下:

在此输入图像描述

在此输入图像描述

请注意,UserId表中的列Employee既是PK,也是表格User列的FK Id.

DbContext尽可能直接 - 没有定义流畅的映射.

public class TestInheritContext : DbContext
{
    public DbSet<User> Users { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

尝试访问Users集合时,我收到以下EF异常:

System.Data.SqlClient.SqlException:无效的列名称"Id".

显然,它试图Id从表中读取列Employee.

我见过的所有TPT示例都在所有表中使用相同的PK列名称.例如, …

entity-framework single-table-inheritance

1
推荐指数
1
解决办法
1299
查看次数