我正在使用带有单个"帐户"表的STI模型来保存用户和技术人员的信息(即用户<帐户,技术人员<帐户).一切都从功能的角度来看,但是在运行单元测试时会发生爆炸:
... 8)错误:test_the_truth(UserTest):ActiveRecord :: StatementInvalid:PGError:错误:关系"技术人员"不存在:删除"技术人员"......
从本质上讲,标准框架不承认技术人员和用户表(或PostgreSQL称之为"关系")不存在,实际上应该为帐户别名.
有任何想法吗?我对RoR比较陌生,我不知道怎么解决这个问题而不是一起扯掉STI.
ruby postgresql unit-testing ruby-on-rails single-table-inheritance
我在Report和Chart之间有一个简单的has_many/belongs_to关系.我遇到的问题是我的图表模型是有孩子的父母.
所以在我的报告模型中我有
class Report < ActiveRecord::Base
has_many :charts
end
Run Code Online (Sandbox Code Playgroud)
我的图表模型是父模型,其中Pie,Line,Bar都继承自Chart.我不确定belongs_to:报告在图表模型中的位置,或图表模型的子项.我尝试访问chart.report时遇到错误,因为该对象的类型为"Class"
未定义的局部变量或方法`report'for#<Class:0x104974b90>
图表模型使用STI,因此它从图表表格中的chart_type列中拉出"性别"..我缺少什么?
编辑
Chart
/ \
Pie Line
/ \
/ \
Gender Sex
Run Code Online (Sandbox Code Playgroud)
我(使用STI)实例化一个Gender或Sex类型的对象.希望这会有所帮助.
我有一种感觉,它的原因
@chart.update_attributes(params[:chart])
Run Code Online (Sandbox Code Playgroud)
因为当提交它的实际参数[:chart]其params [:gender]或params [:sex]
我已经为person类实现了单表继承
class Person < ActiveRecord::Base
end
class Teacher < Person
end
class Student < Person
end
class Outsider < Person
end
Run Code Online (Sandbox Code Playgroud)
而创建人似乎根据form.select中选择的内容创建了Teacher,Student或Person,并添加了type属性.
但是,我似乎打破了路线
<%= link_to'Edit',edit_person_path(@deal)%> | <%= link_to'Back',persons_path%>
它们似乎指向teacher_path,student_path和outsider_path而不是person_path.
路线需要做哪些改变?
ruby routing ruby-on-rails single-table-inheritance ruby-on-rails-3
我有一个带有授权和身份验证逻辑的用户模型。
现在我意识到我有三种不同类型的用户。我想存储有关它们每个的不同信息。
在Rails中处理此问题的最佳方法是什么?
我看过STI,但是从我的阅读中发现这是不合适的,因为最终我的数据库中会有很多NULL字段。
理想情况下,我不想为三种用户类型中的每一种重复验证/授权逻辑。
每个用户在应用程序中还将具有不同的功能。
database-design model ruby-on-rails single-table-inheritance
我对Rails相对较新,到目前为止只编写了一个应用程序.我在该应用程序中使用Devise进行身份验证.现在我要进入第二个,因为我有很多用户类型,而不是我的第一个应用程序中的单个用户类型,所以我必须更多地考虑身份验证.
我一直在研究这些问题,以便当我将代码放到金属(或云)时,我可以在设计时考虑到清晰的设计.
到目前为止,我发现此帖最有用:
背景
我正在创建一个在线市场,客户可以从供应商那里订购东西.
我打算创建以下用户类型:
以下字段是我在上述三种用户类型之间共享的标识:
然后,每个用户类型具有不同的字段(每个4到6个字段).
客户和提供商将自行注册.员工和管理员将分别由提供商和超级管理员注册.
员工将与提供商相关联.我不认为员工与多个提供商有关联.
我也没有预见到具有多个角色的用户的需要.
我的计划
在对选项进行一些研究之后,我决定了以下内容:
我将创建三种不同的用户模型:
在我看来,这些都是真正不同的用户,他们将与应用程序的不同部分进行交互,因此感觉很干净.根据我的研究,这种方法还允许我完全自定义每个用户类别的注册过程.例如,我可以允许客户注册他们的Facebook帐户(使用OmniAuth),但不能将此选项扩展到我的提供商.当然,超级管理员不会:可以注册.据我所知,每个用户都有单独的登录页面,这对我来说不是问题(实际上是可取的).
拥有不同的模型,特别是对于Admin,我可以稍后轻松地重构,以防我需要实现其他角色.
问题
上面的设计是否像我能做到的那么简单?没有任何战斗计划能够与敌人保持联系.但我希望Rails是我的朋友:)所以在纸面上,我的计划对我来说似乎很简单.有什么我想念的东西会使它的实现比纸上的更复杂吗?
此外,即使我已经设计了上述计划(双关语),我也愿意接受其他建议.例如,有什么理由我想为所有模型做STI(有一个用户模型,我的所有其他模型都继承了这个模型)?
谢谢阅读!
我正在研究通知系统,所以我有一个通知抽象类和子类(forumPostNotification,privateMessageNotification等).它们使用单表继承存储,因此它们都在一个具有区分字段的表中.
我希望立即获得适用于用户的所有通知,而不必单独查询每种类型的通知,但是我不确定如何在DQL/symfony中执行此操作(在SQL中这很容易).
我相信这一点:( 主义2:如何编写一个DQL select语句来搜索一些,但不是单个表继承表中的所有实体)类似于我想要实现的,但我不知道如何查询抽象对象.它也不在Entity目录中,而是在Entity/Notifications/Notification.php中.
我将添加一些代码以便澄清:
Notification.php
/**
* Notification Class
*@ORM\Entity
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap({
* "notification"="Notification",
* "forumPostNotification"="ForumPostNotification",
* ...
* })
* @ORM\Table(name="notification")
*/
abstract class Notification
{
/**
* @ORM\ManyToOne(targetEntity="Acme\MainBundle\Entity\User", inversedBy="notifications")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $user;
//...
}
Run Code Online (Sandbox Code Playgroud)
ForumPostNotification.php
/**
* Forum Post Notification
* @ORM\Entity
*/
class ForumPostNotification extends Notification
{
//..
}
Run Code Online (Sandbox Code Playgroud)
PrivateMessageNotification.php
/**
* Private Message Notification
* @ORM\Entity
*/
class PrivateMessageNotification extends Notification
{
//..
}
Run Code Online (Sandbox Code Playgroud)
我希望能够以这样或那样的方式做这样的事情(我明白我不能从Notification中查询,因为它是一个抽象类.我只是这样写它来传达我想要实现的东西): …
好吧,这可能是一个远景,但这里有.
在Java(JRE 1.6.0_26-b03)中,我有两个类SuperControl及其子类SubControl.它们都需要是持久对象,而我正在使用Hibernate Annotations来实现这一点.我有大约210个正确持久的类.除了一个不是.
我的问题是SubControl拒绝以任何方式继承SINGLE_TABLE.当我说"拒绝"时,我的意思是整个JRE崩溃了.
这有点问题,因为我真的更喜欢SuperControl成为映射的超类SubControl.SuperControl也可以是一个持久的实体.奇怪的是,我在其他地方的代码中有一个完全并行的层次结构,它可以正常工作.
这就是我要的:
@Entity
@MappedSuperclass
public class SuperControl extends ItsSuperClass {
// ...
}
@Entity
public class SubControl extends SuperControl {
// ...
}
Run Code Online (Sandbox Code Playgroud)
但它因错误而爆炸
#
# A fatal error has been detected by the Java Runtime Environment:
#
# Internal Error (c1_Optimizer.cpp:271), pid=5456, tid=1260
# guarantee(x_compare_res != Constant::not_comparable) failed: incomparable constants in IfOp
#
# JRE version: 6.0_26-b03
# …Run Code Online (Sandbox Code Playgroud) java inheritance hibernate single-table-inheritance hibernate-annotations
我正在将Entity Framework 6.0.2与现有数据库一起使用,其中标签存储在单个表中,如下所示:
Id:int,主键 TagType:字符串,确定标签的类型,可以是“ usertag”或“ movietag”ItemId:int,包含要引用的项目的ID(用户ID或电影ID)以下类描述了这种情况:
public class User
{
public int Id { get; set; }
}
public class Movie
{
public int Id { get; set; }
}
public abstract class Tag
{
public int Id { get; set; }
public int ItemId { get; set; }
}
public class UserTag : Tag
{
public virtual User User { get; set; }
}
public class MovieTag : Tag
{
public virtual Movie …Run Code Online (Sandbox Code Playgroud) c# entity-framework single-table-inheritance table-per-hierarchy entity-framework-6
我正在尝试通过制作书籍笔记应用程序来学习 Peewee 和 Bottle。
假设我有以下实体:
Subject
Book
Chapter
Note
Tag
Run Code Online (Sandbox Code Playgroud)
我希望能够为章节、书籍和主题做笔记。
在数据库中,你会这样做:
Subject
Book
Chapter
Note
Tag
Run Code Online (Sandbox Code Playgroud)
(如果你想要 note 和 notable 之间的 M:N 关系,你也可以做一个 note_notable 桥接表)。
您将在主题、书籍和章节上插入触发器之前,将一行插入到 noteable 中,检索新行的 noteable_id,并在传入的行上使用它。
我假设如果您使用像 Peewee 这样的 ORM,您会希望在应用程序逻辑而不是触发器中执行此操作。
我如何在 Peewee 中实现这个模型?
我有一个Place使用 STI 约定的基类和多个子类。我有一个单独的模型Post,它belongs_to是以下子类之一Place:
class Place < ApplicationRecord
end
class SubPlace < Place
has_many :posts, class_name: "SubPlace", foreign_key: "sub_place_id"
end
class Post < ApplicationRecord
belongs_to :sub_place, class_name: "SubPlace", foreign_key: "sub_place_id"
end
Run Code Online (Sandbox Code Playgroud)
可以使用 Rails 控制台保存新记录,但在尝试查找特定记录Post时出现以下错误:PostsSubPlace
ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR: column places.sub_place_id does not exist)
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点,或者我的关联必须仅与基类相关?
添加架构:
create_table "posts", force: :cascade do |t|
t.string "title"
t.bigint "sub_place_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["sub_place_id"], name: "index_posts_on_sub_place_id"
end
create_table "places", …Run Code Online (Sandbox Code Playgroud) inheritance ×2
ruby ×2
associations ×1
c# ×1
devise ×1
doctrine ×1
dql ×1
hibernate ×1
java ×1
model ×1
peewee ×1
php ×1
postgresql ×1
python ×1
routing ×1
sti ×1
symfony ×1
unit-testing ×1