了解Model.find返回的对象

时间:2019-04-03 11:22:18

标签: ruby-on-rails

我有一个控制器

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 :(得分:0)

find返回一个对象(选中@datasource.class),但是inspect将其打印在friendly way中。

换句话说,@datasource“包含”模型类的一个实例(DataSource),它是ApplicationRecord的子类,ActiveRecord::BaseRoute::get('itemsImages/{filename}', function ($filename) { $path = app_path('public/images/itemsImages') . '/' . $filename; $response = null; if (file_exists($path)) { $file = File::get($path); $type = File::mimeType($path); $response = Response::make($file, 200); $response->header("Content-Type", $type); } else { dd($path); //does not exist } return $response; })->name('route.name'); 的子类,这就是为什么您拥有所有这些方法的原因。