ruby 单表继承范围

ut6juiuv  于 2023-02-12  发布在  Ruby
关注(0)|答案(1)|浏览(144)

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

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

class StickyPost < Post
end

现在,当我在一个帖子集合上调用sticky时,我会得到一个StickyPost示例集合。
但是当我调用posts.sticky.build时,type被设置为StickyPost,但是类仍然是Post

posts.sticky.build
=> #<Post id: nil, message: nil, type: "StickyPost", created_at: nil, updated_at: nil>
    • 更新**

很显然这很管用。

posts.sticky.build type: 'StickyPost'
=> #<StickyPost id: nil, message: nil, type: "StickyPost", created_at: nil, updated_at: nil>

这很奇怪,因为作用域已经设置了类型,这看起来有点多余。有什么方法可以在作用域中设置这种行为吗?

bvjxkvbb

bvjxkvbb1#

通过在作用域中使用becomes方法,可以使sticky作用域返回正确的类:

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

becomes方法将一个类的示例Map到单表继承层次结构中的另一个类。在本例中,它将sticky作用域返回的Post的每个示例Map到StickyPost。通过此更改,调用posts.sticky.build现在将返回StickyPost的示例:

posts.sticky.build
=> #<StickyPost id: nil, message: nil, type: "StickyPost", created_at: nil, updated_at: nil>

相关问题