Понимание объекта, возвращаемого Model.find - PullRequest
0 голосов
/ 03 апреля 2019

у меня есть контроллер

class DatasourcesController < ApplicationController

В этом контроллере у меня есть:

def show
  ....
  @datasource = DataSource.find(datasource_id)
  ...
end

В datasource_helper.rb У меня есть:

  def datasource_type
    puts "\r\n\r\n::::::::::::\r\n ONCE AGAIN @datasource = #{@datasource.inspect}\r\n::::::::::::\r\n\r\n"
    # @datasource[:dsd_type_id] = "GOV"
    @datasource.partnertype.par_description
  end

Где

puts "\r\n\r\n::::::::::::\r\n ONCE AGAIN @datasource = #{@datasource.inspect}\r\n::::::::::::\r\n\r\n"

печатает что-то вроде:

::::::::::::
 ONCE AGAIN @datasource = #<DataSource ....,  dsd_type_id: "XRPT", ...>
::::::::::::

И когда выполняется @datasource.partnertype.par_description, он выдает запрос такого типа:

SELECT  `partnertype`.* FROM `partnertype` WHERE `partnertype`.`par_code` = 'XRPT' LIMIT 1

Можете ли вы объяснить мне, как происходит это волшебство? Откуда взялись @datasource методы? Когда я проверяю это, я вижу, что это Хэш. Другими словами, какие правила / соглашения применяются к этому? Значит ли это, что переменная экземпляра @datasource по умолчанию унаследовала все методы из соответствующей модели?

Извините, но я новичок в рельсах, все эти неявные правила / соглашения доставляют мне много хлопот.

1 Ответ

0 голосов
/ 03 апреля 2019

find возвращает объект (отметьте @datasource.class), но inspect печатает его дружественным образом .

Другими словами, @datasource "содержит" объектэкземпляр класса вашей модели (DataSource), который является подклассом ApplicationRecord, который является подклассом ActiveRecord::Base, поэтому у вас есть все эти методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...