我在两个实体,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)
是否有更好,更传统的方式来指定它?或者是我能拥有的那么简单?
在我的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集合时,它是空的.谁能告诉我我做错了什么?
我想知道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)
questions_count工作simple_questions_count和complex_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
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) 我有一个名为users的基表,它包含有关用户的所有常见信息,如姓名,地址,电话号码等
我有另一个名为clients的表,它包含有关客户端的特定信息(例如客户端的公司名称及其URL),并从users表继承用户信息.客户端具有外键user_id,其映射回关于用户的信息.
我有另一个名为client_admins的表,它包含有关client_admins的特定信息,还有一个user_id字段和一个client_id字段(链接到clients表).
我有另一个名为super_admins的表,它链接到users表并具有关于超级管理员的特定信息.
我知道我可能会逃脱单表继承,因为每种类型之间没有很多不同的数据,只是不同的功能和特权.
在Rails 3中对此进行建模的最佳方法是什么?
在我的系统中,我已经定义了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
是否可以在返回子类的单个表继承上设置范围?
例如:
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)
这很奇怪,因为范围已经设置了类型,所以看起来有点多余.在范围内设置此行为的任何方法?
我想使用除了以外的列使用单表继承type.根据Rails文档 - http://api.rubyonrails.org/classes/ActiveRecord/Base.html,我可以通过修改来做到这一点ActiveRecord::Base.inheritance_column.我怎样才能做到这一点?
这是我的基本/父实体,设置所以它的子节点使用自己的表.
/**
* @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
在处理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::Guest或Reservation::Event实例时,type保存的值是Reservation::Guest和Reservation::EventRails 3中的.但是在Rails 2中,它保存没有名称空间即,Guest或Event.
它需要付出很多努力来迁移现有数据并更改所有type不需要命名空间的地方.
如果type不在命名空间中进行大量修改,是否可以在没有命名空间和休息的情况下进行保存?
migration legacy-code single-table-inheritance ruby-on-rails-3 ruby-on-rails-2
ruby ×3
has-many ×2
activerecord ×1
associations ×1
doctrine-orm ×1
inheritance ×1
legacy-code ×1
migration ×1
symfony ×1
symfony-2.3 ×1