我正在使用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对象似乎存在一些问题,这是我试图解决的主要问题.对不起,我意识到这不是最清楚的解释.
我之前问了一个关于如何在我正在构建的简单应用程序中构建数据以管理内容的问题.答案是看单表继承,我认为这将是票.
我已经阅读了很多例子,但似乎总是遗漏的一件事是:type type是如何实际填充的?我是否包含一个带下拉列表的表单字段,以便用户可以选择类型?
我相信我完全理解STI现在如何工作(类型字段采用类名)但我仍然缺少一些非常基本的东西(可能非常明显,但我很想念它).有人能填补我吗?
我有一个像这样的内容表:
id
type
name
desc
Run Code Online (Sandbox Code Playgroud)
不同的类型将是"网站","博客","照片".
我正在使用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
在我的应用程序中,我可以使用不同类型的帖子.所以我有想法为此包含单表继承:
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) 有人可以向我解释这里发生了什么吗?
这是一个我放在一起展示你们最新情况的例子:
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) 我正在使用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
我目前正在开展一个项目,您可以在其中保存讲师和学生的详细信息.我不知道我是否应该使用一个表User或两个表Lecturer和Student.
当您作为讲师登录时,您具有特殊权限作为项目的组管理页面,在加载学生不具备的组页面上.在Usertbl中将有一个列
status在哪里注册,您可以选择成为学生或讲师的页面并输入特殊的讲师代码.我正在使用PHP和mySql.
在摘要中,我应该User为学生和讲师使用1个表,还是有2个单独的表Student和Lecturer表.
附加信息:1门课程可以有很多讲师和学生,但是1名学生将有1门课程,其中讲师有很多课程.
mysql database database-design single-table-inheritance class-table-inheritance
为什么我不能在子类中定义具有相同名称的成员?每个类继承一个表rowversion timestamp,每个表中都有一个字段.似乎实体设计者应该允许这样做,并使用new属性上的关键字来实现它.解决方法是什么?如果我不能使用,new如何在具有不同值的继承链中指定相同的字段?对于具有rowguids,modifiedbys,modifieddates等的其他数据库,情况可能如此.
编辑:我想这样做的逻辑方法是重命名对该字段的引用,即PersonRowversion在Student下降的类中Person.
我错过了一块可以自动跟踪这些字段的EF吗?
这是我的模特:
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
我想将两个派生类映射到两个表(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列名称.例如, …