Метод модуля gem нельзя включить в ActiveRecord :: Base - PullRequest
0 голосов
/ 18 июня 2019

У меня в модуле есть модуль

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 ]

1 голос
/ 18 июня 2019

Я рекомендую включать модуль с вашим кодом только в те классы, которые нуждаются в этой функциональности.Включать ваш код в ActiveRecord::Base на самом деле не рекомендуется, другие драгоценные камни, которые вы можете использовать, могут конфликтовать с ним.

Если вам нужно, чтобы ваш код был доступен во всех ваших моделях ActiveRecord, определите его в ApplicationRecord,Поскольку все ваши модели будут наследоваться от него, все получат функциональность.

Если вы хотите добавить метод класса в свой класс AR, создайте модуль с функцией и extend его из вашего класса:

module A
  def foo
    "Hi"
  end
end

class User < ApplicationRecord
  extend A
end

User.foo # => "Hi"

Если вам нужно сделать больше вещей, таких как объявление областей, использование перехватчиков ActiveRecord и т. Д., Вам нужно будет использовать проблемы, см. Здесь

0 голосов
/ 18 июня 2019

определить его без self в модуле

module JoinSelect
  def with
    puts 'with called'
  end
end

и в ApplicationRecord расширение использования для включения его в качестве метода класса

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
  extend JoinSelect
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...