3

可能是一个令人困惑的标题,但不知道该怎么说。示例应该更清楚。我有许多不同的模型,它们具有许多相同的属性。因此,在每个模型中,我必须指定那些相同的属性,然后指定特定于该特定模型的属性。

有什么方法可以创建一些列出这些基本属性的类,然后从该类继承而不使用单表继承?因为如果我将所有共享属性和 Mongoid 包含到单个模型中并从其他模型中的该基本模型继承,那么 STI 将被强制执行,并且我的所有模型都存储在单个 mongodb 集合中,由“_type”字段区分。

这就是我所拥有的:

class Model_1
  include Mongoid::Document

  field :uuid, :type => String
  field :process_date, :type => String
  ...
end

class Model_2
  include Mongoid::Document

  field :uuid, :type => String
  field :process_date, :type => String
  ...
end

但这是我追求的功能:

class Base_model
  field :uuid, :type => String
  field :process_date, :type => String
end

class Model_1 < Base_model
  # To ensure STI is not enforced
  include Mongoid::Document

  # Attribute list inherited from Base_model
end

问题是,如果 Base_model 中没有“include Mongoid::Document”,则该基本模型不知道“field ...”功能。但是,如果您确实将 mongoid 包含在基本模型中并从它继承,则会强制执行 STI。

我不能针对这种特殊情况进行 STI,但是拥有多个模型是一场编码噩梦,所有模型都一遍又一遍地指定相同的属性列表(模型数量越来越多,每个共享大约 15-20 个属性,所以任何时候我必须更改模型名称,到处更改它需要付出很多努力......)。

4

3 回答 3

4

您可以在模块中定义公共属性并将其包含在内。

require 'mongoid'

module DefaultAttrs

  def self.included(klass)
    klass.instance_eval do
      field :uuid, :type => String
    end
  end

end

class Foo
  include Mongoid::Document
  include DefaultAttrs

  field :a, :type => String
end

class Bar
  include Mongoid::Document
  include DefaultAttrs

  field :b, :type => String
end
于 2012-04-25T19:23:26.700 回答
0

我有完全相同的问题,最初想采用 mixin 方法。然而,在与一些专家交谈后发现,使用 mongoids 单表继承(所有子元素的一个集合)可能是可行的方法,具体取决于您的用例。请在此处查看我的帖子: 单个集合与继承对象的单独集合

于 2012-05-24T14:32:03.493 回答
0

您可以将它们捆绑到一个新模块中,即

module Mongoid
  module Sunshine
    extend ActiveSupport::Concern

    included do
      include Mongoid::Document
      include Mongoid::Timestamps
      include Mongoid::TouchParentsRecursively
      include Mongoid::Paranoia
      include Mongoid::UUIDGenerator
    end
  end
end


class School
  include Mongoid::Sunshine
end
于 2013-11-01T03:30:12.373 回答