Rails继承了相同行为但属性不同的类

时间:2012-09-08 00:03:37

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

我一直在研究我的问题的最佳方法,我最初将其作为单个表继承实现,但我对可伸缩性深表关注,因为表中可能有数千列。

所以问题是我希望产品的方法完全相同,唯一的区别是每个产品所包含的属性。似乎在这种情况下,多类继承(在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

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

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

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分:0)

发现我可以将H-store与postgres一起使用,这使得我可以拥有一个包含可以与postgres的强大功能一起使用的模式更少哈希的列(例如,查看{{3} })