2

我有一个问题,我认为这对大多数 RoR 开发人员来说是基本的。事实上,它更多的是关于“理解”而不是真正的编程(我已经编写了一些模块来扩展 ActiveRecord::Base 以允许轻松生成与 Ext-JS 相关的东西而没有任何问题)。

让我们举一个简单的例子,我将使用面向 ORM 的语言而不是数据库/模型语言。

  • 第三方是一个基本实体,有一个名为“标签”的通用成员。
  • 第三方实例可以是客户、供应商,或者两者都不是(因此客户/供应商就像具体的接口而不是继承的类)。
  • 客户和供应商都有专门的成员,它们中的大多数对于每个类都是唯一的(客户/供应商除了通过第三方绑定的标签字段外不共享太多数据)。

我试图做各种各样的事情:

  • 第三方 < ActiveRecord::Base
  • 客户 < 第三方
  • 供应商 < 第三方

[编辑] 在这里错过了我的解释。我的意思是:第三方的一个实例可以是客户、供应商、两者或无。正如第一个评论者指出的那样,我的例子可能不是最好的......您可以用“Character”替换“ThirdParty”,用“Archer”/“SwordsMan”替换“Customer”/“Supplier”。一个字符可以是一个、两个、两个或一个都没有,但会提供有关任何 Character 实例的信息。Archer / SwordsMan 上的 getter 应返回 Character 实例“实现”接口契约,而不是仅返回他们自己的实例,并在角色对象上使用“getter”。[/编辑]

我也试过:

  • 第三方 < ActiveRecord::Base (has_one Customer; has_one Supplier)
  • 客户 < ActiveRecord::Base (belongs_to ThirdParty)
  • 供应商 < ActiveRecord::Base (belongs_to ThirdParty)

但这对我来说似乎有点“丑陋”,因为我必须做 Customer.find(something).third_party.label 来访问我的“接口”“继承”的数据。

此外,我可以在我的第三方模型中包含一个 customer_id 和一个供应商 ID 字段,但它似乎也不正确,因为一个第三方可以是两者,或者它们都不是......

当然,我希望能够找到一个不妨碍/没有太多技巧的解决方案,例如让我可以为另一个模型做一些多态关联(例如可寻址或可评论,可接触等...)

我也一直在阅读很多关于这个主题的文章,比如在这样的博客上:http: //mediumexposure.com/multiple-table-inheritance-active-record/ ...但我迷失在正确的方式上(在我在该主题上找到的大多数文档都不清楚是否适用于 Rails 1、2、3 ......最近在这个问题上实施了什么,等等)。

有人可以为我提供各种“最新”网站或适合我给出的示例的示例吗?

提前,我感谢大家提出我的问题,并最终向我解释在这个特定主题上使用的不同技术。

PS:如果您需要我解释更多我在寻找什么,我可以尝试......但请记住,我的英语在这个领域有点“有限”,因为我对 RoR 比较陌生。

4

2 回答 2

3

只有一个共同的字段,单(或多)表继承可能不是要走的路。如果您想在类之间共享功能,我将创建一个包含在每个类中的第三方模块:

module ThirdParty
  def self.included(base)
    base.extend ClassMethods
  end

  module ClassMethods
    # define your shared class methods here
  end

  # define you shared instance methods down here
end

class Customer < ActiveRecord::Base
  include ThirdParty
end

class Supplier < ActiveRecord::Base
  include ThirdParty
end

这允许您定义利用每个包含类的标签属性的方法。您提到您希望能够与其他模型交互,可能是多态的。如果这些关联存在于所有 ThirdParty 对象中,那么您只需在 self.included 调用(使用 instance_eval)或 ClassMethods 作为方法中设置关联:

module ThirdParty
  def self.included(base)
    base.extend ClassMethods
    base.instance_eval do
      has_many :buyers, :as => :third_party
    end
  end

  module ClassMethods
    def has_address
      has_one :address, :as => :third_party
      delegate :street, :city, :state, :zip, :to => :address
    end
  end
end

class Supplier < ActiveRecord::Base
  include ThirdParty # this would set up the :buyers association

  has_address # this sets up the address association
end

希望这会有所帮助。有关执行此类操作的更多信息,只需谷歌“ruby mixin”-那里有大量信息。

于 2011-03-19T20:50:51.593 回答
1

我最近分叉了一个很有前途的项目来在 Rails 中实现多表继承和类继承。我花了几天时间对其进行快速开发、修复、评论和文档,并将其重新发布为 CITIER(Rails 的类继承和表继承嵌入)。

我认为您可以将其与上述答案结合起来吗?

考虑看看: http: //peterhamilton.github.com/citier

本质上,您可以在第三方类中拥有公共字段并创建继承它们的客户或供应商对象。

您可以创建一个包含两者都使用的功能的模块并在它们之间共享吗?

CITIER 不允许您同时拥有第三方作为客户和供应商,因为它依赖于不支持多重继承的 Ruby 继承。我会想象某种共享模块解决方案会使那部分工作?

事实上,CITIER 已经使用了类似于上面答案的东西,所以会看到正确的轨道。

于 2011-04-28T23:29:52.303 回答