我的宝石中有一个模块
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.
答案 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