gem模块方法不能包含在ActiveRecord :: Base中

时间:2019-06-18 18:19:47

标签: ruby-on-rails inheritance rubygems

我的宝石中有一个模块

module joinSelect
  def self.with
    puts 'with called'
  end
  ActiveRecord::Base.send :include, self
end

但是我无法在任何模型类中访问方法

irb(main):015:0> User.with
NoMethodError: undefined method `with' for User (call 'User.connection' to establish a connection):Class

我尝试放

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
  include JoinSelect
#or
  extend JoinSelect

end
``
doesen't work. How can I get "with" accessible on ApplicationRecord ?
Thanks in advance.

2 个答案:

答案 0 :(得分:1)

我建议仅在需要该功能的类中将模块包含在您的代码中。确实不建议在ActiveRecord::Base中包含您的代码,您可能使用的其他gem可能与此冲突。

如果您需要所有ActiveRecord模型上都可用的代码,请在ApplicationRecord中进行定义。由于您的所有模型都将从其继承,因此所有人都将获得功能。

如果要在AR类中添加类方法,请使用函数创建一个模块,并从您的类中extend对其进行

module A
  def foo
    "Hi"
  end
end

class User < ApplicationRecord
  extend A
end

User.foo # => "Hi"

如果您需要做更多事情,例如声明范围,使用ActiveRecord钩子等,那么您将需要使用关注点,see here

答案 1 :(得分:0)

在模块

中不使用self定义它
module JoinSelect
  def with
    puts 'with called'
  end
end

并在ApplicationRecord中使用扩展将其包括为类方法

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
  extend JoinSelect
end