标签: single-table-inheritance

Ruby on Rails单表继承(STI)和单元测试问题(使用PostgreSQL)

我正在使用带有单个"帐户"表的STI模型来保存用户和技术人员的信息(即用户<帐户,技术人员<帐户).一切都从功能的角度来看,但是在运行单元测试时会发生爆炸:

... 8)错误:test_the_truth(UserTest):ActiveRecord :: StatementInvalid:PGError:错误:关系"技术人员"不存在:删除"技术人员"......

从本质上讲,标准框架不承认技术人员和用户表(或PostgreSQL称之为"关系")不存在,实际上应该为帐户别名.

有任何想法吗?我对RoR比较陌生,我不知道怎么解决这个问题而不是一起扯掉STI.

ruby postgresql unit-testing ruby-on-rails single-table-inheritance

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

使用belongs_to进行Rails对象继承

我在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]

inheritance ruby-on-rails single-table-inheritance

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

实现单表继承后损坏的Rails路由

我已经为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

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

如何在Rails中为不同的用户建模

我有一个带有授权和身份验证逻辑的用户模型。

现在我意识到我有三种不同类型的用户。我想存储有关它们每个的不同信息。

在Rails中处理此问题的最佳方法是什么?

基于当前阅读的想法

我看过STI,但是从我的阅读中发现这是不合适的,因为最终我的数据库中会有很多NULL字段。

理想情况下,我不想为三种用户类型中的每一种重复验证/授权逻辑。

每个用户在应用程序中还将具有不同的功能。

database-design model ruby-on-rails single-table-inheritance

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

使用Devise和STI设计具有多种用户类型的Rails应用程序

我对Rails相对较新,到目前为止只编写了一个应用程序.我在该应用程序中使用Devise进行身份验证.现在我要进入第二个,因为我有很多用户类型,而不是我的第一个应用程序中的单个用户类型,所以我必须更多地考虑身份验证.

我一直在研究这些问题,以便当我将代码放到金属(或云)时,我可以在设计时考虑到清晰的设计.

到目前为止,我发现此帖最有用:

背景

我正在创建一个在线市场,客户可以从供应商那里订购东西.

我打算创建以下用户类型:

  • 客户:访问市场并订购东西
  • 提供者:在市场中创建东西并处理订单
  • 员工:适用于提供商
  • 超级管理员:管理网站
  • 管理员:管理由超级管理员委派的部分网站

以下字段是我在上述三种用户类型之间共享的标识:

  • 电子邮件地址(用作登录ID)
  • 手机号码

然后,每个用户类型具有不同的字段(每个4到6个字段).

客户和提供商将自行注册.员工和管理员将分别由提供商和超级管理员注册.

员工将与提供商相关联.我不认为员工与多个提供商有关联.

我也没有预见到具有多个角色的用户的需要.

我的计划

在对选项进行一些研究之后,我决定了以下内容:

我将创建三种不同的用户模型:

  • 顾客
  • 提供商
  • 超级管理员

在我看来,这些都是真正不同的用户,他们将与应用程序的不同部分进行交互,因此感觉很干净.根据我的研究,这种方法还允许我完全自定义每个用户类别的注册过程.例如,我可以允许客户注册他们的Facebook帐户(使用OmniAuth),但不能将此选项扩展到我的提供商.当然,超级管理员不会:可以注册.据我所知,每个用户都有单独的登录页面,这对我来说不是问题(实际上是可取的).

拥有不同的模型,特别是对于Admin,我可以稍后轻松地重构,以防我需要实现其他角色.

问题

上面的设计是否像我能做到的那么简单?没有任何战斗计划能够与敌人保持联系.但我希望Rails是我的朋友:)所以在纸面上,我的计划对我来说似乎很简单.有什么我想念的东西会使它的实现比纸上的更复杂吗?

此外,即使我已经设计了上述计划(双关语),我也愿意接受其他建议.例如,有什么理由我想为所有模型做STI(有一个用户模型,我的所有其他模型都继承了这个模型)?

谢谢阅读!

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

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

Doctrine单表继承查询所有实例

我正在研究通知系统,所以我有一个通知抽象类和子类(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中查询,因为它是一个抽象类.我只是这样写它来传达我想要实现的东西): …

php doctrine single-table-inheritance dql symfony

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

除了SINGLE_TABLE之外,在使用任何其他Hibernate继承策略时JVM崩溃

好吧,这可能是一个远景,但这里有.

在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

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

EF6-使用基类属性的派生类中的TPH外键映射

我正在将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

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

Peewee 和数据库继承

我正在尝试通过制作书籍笔记应用程序来学习 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 中实现这个模型?

python single-table-inheritance concrete-inheritance peewee

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

模型是否属于性传播感染儿童?

我有一个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)

ruby-on-rails associations single-table-inheritance

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