当前位置:  开发笔记 > 运维 > 正文

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

如何解决《RailsActiveRecord-从没有表的基类继承》经验,为你挑选了3个好方法。

我想要做的是为我的一些模型设置一个基类,它具有一些默认的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基类不需要表.它只是用于额外行为,并像往常一样将其他子类放在自己的表中.

谢谢,克雷格



1> François Bea..:

你想要的是一个抽象类:

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

class ColorOption < Option
  ...
end

class FabricOption < Option
  ...
end

我在博客上有一些关于STI和#abstract_class的额外信息.


不需要set_table_name,至少在Rails 3.2中.

2> 小智..:

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

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/



3> Szymon Przyb..:

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

我已经通过创建抽象的AR类来实现它,正如@FFrançois所说,并且使用继承的方法,我正在更改表名,如下所示:

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 :)

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有