Как получить доступ к методу .find () в Ruby on Rails? - PullRequest
0 голосов
/ 10 мая 2018

Я знаю, как использовать метод find, и я хочу понять логику получения доступа к нему. Я пытаюсь выяснить, как ActiveRecord дает доступ к методу find.

Насколько я могу судить, все сгенерированные модели наследуются от ActiveRecord::Base. Согласно исходным файлам, метод find, похоже, находится внутри модуля FinderMethods. Однако я не могу найти, как или каким образом ActiveRecord::Base связан с модулем FinderMethods для предоставления доступа к методу find.

Если бы кто-то мог помочь объяснить, это было бы благодарно.

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Методы Finder являются частью ActiveRecord :: Relation, а не ActiveRecord :: Base.

https://github.com/rails/rails/blob/375a4143cf5caeb6159b338be824903edfd62836/activerecord/lib/active_record/relation.rb#L18

ActiveRecord :: Relation - это запрос , который будет выполняться в базе данных , а ActiveRecord: Base - это экземпляр строки / с из ActiveRecord :: Relation.

0 голосов
/ 10 мая 2018

Как указывалось ранее, причина, по которой вы найдете метод, находится в Класс отношений должен делать что-то вроде:

# Assume class User < ActiveRecord::Base
u = User.where('1=1').find(1)

Если вы посмотрите глубже:

puts User.where('1=1').class.name
=> "ActiveRecord::Relation"

И так как класс Relation включает в себя модуль FinderMethods, метод find будет доступен как метод экземпляра класса Relation, поэтому вы можете выполнить упомянутый вызов:

User.where('1=1').find(1)

Теперь, если вам интересно, почему вы можете сделать это:

User.find(1)

Вы должны взглянуть на эту строку в классе ActiceRecord :: Base

extend Querying

И если вы увидите модуль ActiveRecord :: Querying, вы найдете следующую строку:

delegate :find, :take, :take!, :first, :first!, :last, :last!, :exists?, :any?, :many?, :none?, :one?, to: :all

Итак, что здесь происходит, так это то, что ActiveRecord :: Base будет иметь метод класса find, потому что он расширяет запрос, который делегирует метод find через весь метод, определенный в классе Relation. Ключевым моментом здесь является понимание того, что делают делегаты, и вот что можно сделать:

https://apidock.com/rails/Module/delegate

0 голосов
/ 10 мая 2018

Вот оно:

$ grep include.FinderMethods . -r
./activerecord-4.2.8/lib/active_record/relation.rb:    include FinderMethods, Calculations, SpawnMethods, QueryMethods, Batches, Explain, Delegation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...