gpt4 book ai didi

ruby-on-rails-3 - Rails 3 通过 mongoid 适配器使用 MongoDB - 有没有办法在不使用单表继承的情况下共享属性规范?

转载 作者:可可西里 更新时间:2023-11-01 09:32:15 24 4
gpt4 key购买 nike

可能是一个令人困惑的标题,但不确定如何表达。示例应该更清楚。我有许多共享许多相同属性的不同模型。因此,在每个模型中,我必须指定那些相同的属性,然后指定特定于该特定模型的属性。

有什么方法可以创建一些列出这些基本属性的类,然后在不使用单表继承的情况下从该类继承?因为如果我将所有共享属性和 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 个属性,因此,无论何时我必须更改模型名称,都需要付出很多努力才能在任何地方更改它...)。

最佳答案

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

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

关于ruby-on-rails-3 - Rails 3 通过 mongoid 适配器使用 MongoDB - 有没有办法在不使用单表继承的情况下共享属性规范?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10317376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com