首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Rails ActiveRecord -从没有表的基类继承

Rails ActiveRecord -从没有表的基类继承
EN

Stack Overflow用户
提问于 2010-08-21 00:45:00
回答 3查看 10.6K关注 0票数 21

我想做的是为我的一些模型创建一个基类,它具有一些默认的activerecord行为:

class Option < ActiveRecord::Base
  has_many :products

  def some_method
    #stuff
  end

  #etc..etc..
end

class ColorOption < Option
  #stuff...
end


class FabricOption < Option
  #stuff...
end

但是,我希望ColorOption和FabricOption分别位于各自的表中。我不想使用STI或基类"Option“的表。我让它工作的唯一方法是使用一些非继承元编程魔术。但我想知道是否有一种方法可以告诉AR基类不需要表。它只是用于额外的行为,并像往常一样将其他子类放在自己的表中。

谢谢,克雷格

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-21 02:30:36

看起来像是您所包含的模块的案例。

module Option
  def self.included(base)
    base.has_many :products
  end

  # other instance methods
end

class ColorOption < ActiveRecord::Base
  include Option
  set_table_name '???' # unless ColorOption / FabricOption have same table -> move to Option module

  #stuff...

end


class FabricOption < Option
  include Option
  set_table_name '???' # unless ColorOption / FabricOption have same table -> move to Option module

  #stuff...
end

更多信息:http://mediumexposure.com/multiple-table-inheritance-active-record/

票数 17
EN

Stack Overflow用户

发布于 2010-08-21 04:07:34

您需要的是一个抽象类:

class Option < ActiveRecord::Base
  self.abstract_class = true
end

class ColorOption < Option
  ...
end

class FabricOption < Option
  ...
end
票数 58
EN

Stack Overflow用户

发布于 2013-07-19 20:08:39

我也有类似的问题,但我也想改变AR为我的模型设置table_name的方式,例如MyProject模型将具有表名为"MY_PROJECT“。

正如@FFrançois所说,我通过创建抽象AR类和继承方法实现了这一点,其中我更改了表名,如下所示:

class MyModel < ActiveRecord::Base
  self.abstract_class = true

  def self.inherited(subclass)
    subclass.table_name = subclass.name.underscore.upcase
  end
end

class MyProject < MyModel
end

现在MyProject.table_name提供了MY_PROJECT :)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3532985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档