标签: single-table-inheritance

has_many和单表继承

我在两个实体,Feeds和Posts之间有一个很好的关系.我还有特定类型的帖子,视频和照片.这是使用单表继承在数据库中构建的.

现在我的Feed模型指定了Feeds和Posts之间的has_many关系(包括子类型)

class Feed < ActiveRecord::Base
  has_many :posts
  has_many :photos
  has_many :videos
Run Code Online (Sandbox Code Playgroud)

是否有更好,更传统的方式来指定它?或者是我能拥有的那么简单?

ruby-on-rails has-many single-table-inheritance

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

has_many具有多级层次结构和单表继承

在我的Rails应用程序中,我有以下类型的多级层次结构:

class Vehicle < ActiveRecord::Base end
class RoadVehicle < Vehicle end
class Car < RoadVehicle end
class Buss < RoadVehicle end
Run Code Online (Sandbox Code Playgroud)

然后我有一个引用中间级别的类,如下所示:

class Garage < ActiveRecord::Base
  has_many :road_vehicles
end
Run Code Online (Sandbox Code Playgroud)

在这个简化的示例中,我为vehicles表提供了一个类型列以启用单表继承.此外,它包含garage_id列,以启用has_many关系.当我创建一个新车库并添加汽车和公共汽车时,所有都会按预期添加到数据库中.但是,当我稍后检索车库对象并检查road_vehicles集合时,它是空的.谁能告诉我我做错了什么?

ruby-on-rails associations single-table-inheritance

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

单表继承中的counter_cache

我想知道counter_cache是​​否可以在单表继承中工作.

对于这些型号:

class User
  has_many :questions
end

class Question
  belongs_to :user, :counter_cache => true
end

class SimpleQuestion < Question
end
class ComplexQuestion < Question
end
Run Code Online (Sandbox Code Playgroud)

那么下面的计数器会起作用吗?

create_table(:users) do |t|
  t.integer :questions_count
  t.integer :simple_questions_count
  t.integer :complex_questions_count
end
Run Code Online (Sandbox Code Playgroud)
  1. 所有这些都有效
  2. 他们都没有工作
  3. 只有questions_count工作
  4. 只有simple_questions_countcomplex_questions_count

哪一个?我猜第3次,但我还想要4次.如果不是4,我怎么做4工作?

===更新===

这是一个例子:

id, user_id, question_content, type
1, 3, something, SimpleQuestion
2, 3, something, SimpleQuestion
3, 3, something, ComplexQuestion
Run Code Online (Sandbox Code Playgroud)

所以现在我想:

user.questions_count # => 3
user.simple_questions_count # => 2
user.complex_questions_count # => 1
Run Code Online (Sandbox Code Playgroud)

我的问题是,什么是基本行为,:counter_cache => …

ruby-on-rails has-many single-table-inheritance counter-cache ruby-on-rails-3

6
推荐指数
2
解决办法
1274
查看次数

is_a?在Rails 3中使用单表继承失败

Object#is_a? 在Rails 3中以最奇怪的方式失败.我的单表继承设置如下(简化为简洁):

# resource.rb
class Resource < ActiveRecord::Base
  # blah blah
end

# video.rb
class Video < Resource
  # blah blah
end
Run Code Online (Sandbox Code Playgroud)

在我的控制器中,我有这个:

def create
  @resource = Resource.find params[:resource_id]
  logger.info '@resource class: ' + @resource.class.name
  logger.info '@resource superclass: ' + @resource.class.superclass.name
  logger.info '@resource is_a?(Video): ' + @resource.is_a?(Video).inspect
  logger.info '@resource is_a?(Resource): ' + @resource.is_a?(Resource).inspect
  logger.info '@resource is_a?(ActiveRecord::Base): ' + @resource.is_a (ActiveRecord::Base).inspect
  # Do some other stuff
end
Run Code Online (Sandbox Code Playgroud)

调用该#create操作会生成以下日志结果:

@resource class: Video
@resource superclass: Resource
@resource is_a?(Video): true
@resource …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails single-table-inheritance

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

Ruby On Rails分层关系建模

我有一个名为users的基表,它包含有关用户的所有常见信息,如姓名,地址,电话号码等

我有另一个名为clients的表,它包含有关客户端的特定信息(例如客户端的公司名称及其URL),并从users表继承用户信息.客户端具有外键user_id,其映射回关于用户的信息.

我有另一个名为client_admins的表,它包含有关client_admins的特定信息,还有一个user_id字段和一个client_id字段(链接到clients表).

我有另一个名为super_admins的表,它链接到users表并具有关于超级管理员的特定信息.

我知道我可能会逃脱单表继承,因为每种类型之间没有很多不同的数据,只是不同的功能和特权.

在Rails 3中对此进行建模的最佳方法是什么?

inheritance ruby-on-rails single-table-inheritance

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

Rails单表继承:如何覆盖写入类型字段的值

在我的系统中,我已经定义了STI.Dog继承自Animal,在animals表中有一个type值的列"Dog".

现在我想SpecialDog继承狗,只是为了在某些特殊情况下略微修改行为.数据仍然相同.我需要运行的所有查询SpecialDog来返回数据库中具有该类型的值Dog.

我的问题是,因为我有一个type列,rails附加WHERE "animals"."type" IN ('SpecialDog')到我的查询,所以我无法访问原始Dog条目.所以我想要的是以某种方式覆盖rails在访问数据库时使用的值SpecialDog,就像表现一样Dog.

有没有办法覆盖类型列使用的rails值?

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

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

单表继承范围

是否可以在返回子类的单个表继承上设置范围?

例如:

class Post < ActiveRecord::Base
  scope :sticky, -> { where(type: 'StickyPost') }
end

class StickyPost < Post
end
Run Code Online (Sandbox Code Playgroud)

现在,当我调用sticky一组帖子时,我得到了一组StickyPost实例.

但是当我打电话时posts.sticky.build,它type被设定为StickyPost,但是课程仍然是Post.

posts.sticky.build
=> #<Post id: nil, message: nil, type: "StickyPost", created_at: nil, updated_at: nil>
Run Code Online (Sandbox Code Playgroud)

更新

显然这是有效的.

posts.sticky.build type: 'StickyPost'
=> #<StickyPost id: nil, message: nil, type: "StickyPost", created_at: nil, updated_at: nil>
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为范围已经设置了类型,所以看起来有点多余.在范围内设置此行为的任何方法?

ruby ruby-on-rails single-table-inheritance ruby-on-rails-4

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

在rails应用程序中更改ActiveRecord :: Base.inheritance_column

我想使用除了以外的列使用单表继承type.根据Rails文档 - http://api.rubyonrails.org/classes/ActiveRecord/Base.html,我可以通过修改来做到这一点ActiveRecord::Base.inheritance_column.我怎样才能做到这一点?

activerecord ruby-on-rails single-table-inheritance

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

单个表继承实体可以扩展类表​​继承实体吗?

这是我的基本/父实体,设置所以它的子节点使用自己的表.

/**
 * @ORM\Entity
 * @ORM\Table(name="layer_object")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"service"="Service", "aircraft"="Aircraft", ...})
 */
class LayerObject {}

飞机实体.一个表现不错的简单孩子

/**
 * @ORM\Entity
 * @ORM\Table(name="aircraft")
 */
class Aircraft extends LayerObject

服务实体.一个复杂的子节点,它本身就是使用单表继承.

/**
 * @ORM\Entity
 * @ORM\Table(name="service")
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"ground"="Ground", "onboard"="Onboard"})
 */
class Service extends LayerObject {}

服务实体的子女

/**
 * @ORM\Entity
 */
class Ground extends Service {}


app/console doctrine:schema:validate发现没有错误但app/console doctrine:schema:update --force只是不会生成'service'表,应该使用单表继承.似乎简单地忽略了服务实体定义.

当然我可以手动为这个表创建SQL,但是应用程序会增长,在某些时候我将需要使用迁移.

任何人都可以指向某个方向吗?谢谢.

发现重复,但到目前为止还没有答案,请参阅:Doctrine 2多级继承

编辑:
当我为第二级使用类表继承时(@ORM\InheritanceType("JOINED")对于Service实体),它工作得很好.请参阅: …

single-table-inheritance class-table-inheritance symfony doctrine-orm symfony-2.3

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

单表继承和命名空间类的'type'值

在处理Rails 2.3.18到Rails 3.2.x迁移时,我在type列中面临名称问题

这是定义的关系.

app/models/reservation.rb

class Reservation
end

class Reservation::Guest < Reservation
end

class Reservation::Event < Reservation
end
Run Code Online (Sandbox Code Playgroud)

在保存Reservation::GuestReservation::Event实例时,type保存的值是Reservation::GuestReservation::EventRails 3中的.但是在Rails 2中,它保存没有名称空间即,GuestEvent.

它需要付出很多努力来迁移现有数据并更改所有type不需要命名空间的地方.

如果type不在命名空间中进行大量修改,是否可以在没有命名空间和休息的情况下进行保存?

migration legacy-code single-table-inheritance ruby-on-rails-3 ruby-on-rails-2

6
推荐指数
2
解决办法
2283
查看次数