【问题标题】:Rails inheritance for classes of same behaviour but different attributes具有相同行为但不同属性的类的 Rails 继承
【发布时间】:2012-09-01 20:28:53
【问题描述】:

我一直在研究解决我的问题的最佳方法,我最初是作为单表继承实现的,但我非常担心可伸缩性,因为表中可能会有数千列。

所以问题是我想要每个产品的方法完全相同的产品,唯一的区别是每个产品包含的属性。在这种情况下,多类继承(rails 本身不支持?)似乎是最好的方法或某种多态关联。

我想朝着以下方向努力

#product.rb
Class Product < ActiveRecord::Base

 attr_accessible :title .....

 def to_s # some arbitrary method used by all extending classes
 ....
 end

end


#book.rb
class Book < Product
 attr_accessible :author...
end

所以我希望这本书继承产品的方法,而不是让产品知道每个子类所需的属性。如果可能,通过一次查询获取所有产品。

我需要知道解决这个问题的最佳方法,如果我做错了,请注意上面编写的代码只是为了简化我的问题。

【问题讨论】:

  • 有没有考虑过像Mongodb这样的文档数据库?您可以为每个类定义属性,这样您就可以灵活地使用您想要的任何属性,而无需更改所有模型的数据库表。
  • 没有考虑过使用 Mongo,正计划使用 postgres,因为数据库可能有数百万行,并决定 postgres 在这些方面是最可靠的。在postgres或者mysql中实现这个结构不可行吗?我来自更强大的 OO 背景,这在其他语言中是一件非常简单的事情:P
  • 我假设每个模型都有不同的列,这就是为什么我建议使用无模式的东西。

标签: ruby-on-rails inheritance associations polymorphism scalability


【解决方案1】:

您可以做的是创建一个模块并将其包含在几个不同的模型中。

首先,在你的lib目录下创建一个文件

即)my_module.rb

module MyModule
  def full_name
    "#{first_name} #{last_name}"
  end
end

然后,确保在 Rails 应用启动时加载模块:

在 config/application.rb 中:

config.autoload_paths += %W(#{config.root}/lib)

最后,将它包含在您的模型中:

即)app/models/thing.rb

class Thing < ActiveRecord::Base
  attr_accessible :first_name, :last_name

  include AdditionMod
end

您可以在控制台中测试它:

@thing = Thing.create(first_name: "Awesome", last_name: "Module")
@thing.full_name
=> "Awesome Module"

【讨论】:

  • 哇,现在感觉自己像个白痴。感谢您提供优雅的解决方案。另一个愚蠢的问题是,有一种方法可以让我使用类似的方法在多个表中“共享”属性(而不是编写迁移来实现)
  • 不做太多细节,看看polymorphic associations
【解决方案2】:

发现我可以将 H-store 与 postgres 结合使用,这使我可以拥有一个包含模式较少哈希的列,该哈希可以与 postgres 的强大功能一起使用(例如,请查看 http://hstoredemo.herokuapp.com/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2022-11-02
    • 2013-07-31
    相关资源
    最近更新 更多