dileep nandanam
dileep nandanam

Reputation: 2885

gem module method cant be included to ActiveRecord::Base

I have a module in my gem

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

but I am unable to access method with in any of model classes

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

I have tried putting

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.

Upvotes: 0

Views: 138

Answers (2)

rogercampos
rogercampos

Reputation: 1724

I'll recommend to include the module with your code only in the classes that will need that functionality. Including your code in ActiveRecord::Base is really not recommended, other gems you may use may conflict with it.

If you need your code to be available on all your ActiveRecord models, then define it in your ApplicationRecord. Since all your models will inherit from it, all will gain the functionality.

If you want to add a class method in your AR class, create a module with the function and extend it from your class:

module A
  def foo
    "Hi"
  end
end

class User < ApplicationRecord
  extend A
end

User.foo # => "Hi"

If you need to do more things, like declaring scopes, using ActiveRecord hooks, etc. then you'll need to use concerns, see here

Upvotes: 1

M.Elkady
M.Elkady

Reputation: 1133

define it without self in module

module JoinSelect
  def with
    puts 'with called'
  end
end

and in ApplicationRecord use extend to include it as a class method

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

Upvotes: 0

Related Questions