新手问题 请教大大一个 Ruby 类继承的问题

physaris · 2019年11月20日 · 最后由 physaris 回复于 2019年12月06日 · 2579 次阅读

场景是这样的:

有一个虚父类,在数据库里面不会对应实际的表, 有很多子类会继承这个父类,在数据库中将会对应实际存在的表, 想要让所有子类默认以 form_date 时间倒序排列。

class Form  < ActiveRecord::Base
  self.abstract_class = true
  default_scope order("#{table_name}.form_date DESC")
end

class SubForm < Form
end

大大可能会有疑问为什么要在form_date前面加上#{table_name}.是因为这些 Model 将来会 join 查询, 但 join 的表里面可能有的也包含form_date字段,这样 Rails 会报错ambiguous column name: form_date。 但如果采用我现在这样的代码,因为虚父类不对应表所以会有语法错误default_scope order(".form_date DESC")

class Form  < ActiveRecord::Base
  self.abstract_class = true
  default_scope order("#{table_name}.form_date DESC") if !abstract_class  # <---------------
end

class SubForm < Form
end

如果采用上面的代码呢,箭头所指这行貌似在子类中不执行,子类没有被按照form_date倒序排列。

Ruby 基础不太好,请教大大们,谢谢!

class Form  < ActiveRecord::Base
  self.abstract_class = true
  def self.inherited klass
    klass.class_eval do
      default_scope order("#{table_name}.form_date DESC")
    end
  end
end

class SubForm < Form
end

语法错误,改成下面这样试试:

default_scope { order("#{table_name}.form_date DESC") }

看 api 文档:default_scope(scope = nil, &block)

physaris 关闭了讨论。 12月06日 16:10
需要 登录 后方可回复, 如果你还没有账号请 注册新账号