对返回对象的行为感到困惑

时间:2015-06-13 13:58:45

标签: ruby-on-rails ruby model find-by-sql

将Model.find_by_sql触发为;

data = Setup::Type.find_by_sql ["SELECT value FROM table WHERE type_cd = 'print_format' AND subtype_cd = 'schedule_print_format'"]

该对象返回为;

#<Setup::Type:0x60c42f0>
#<Setup::Type:0x60c4140>
#<Setup::Type:0x60c3f90>

使用&#39;检查&#39;对数据起作用,它重新出现

[#<Setup::Type value: "SalesReceipt_Bhindi_sch.rpt">, #<Setup::Type value: "SpecialOrder_Bhindi_sch.rpt">, #<Setup::Type value: "ReturnReceipt_Bhindi_sch.rpt">, #<Setup::Type value: "Takepayment_Bhindi_sch.rpt">]

在使用data.class时,它返回Array。

然而,这可以很好地用作&#39;哈希&#39;据我所知,

data.each do |name|
  xml  =  Hpricot::XML(%{
                   <params>
                    <from_trans_date>#{date_for_transaction}</from_trans_date>
                    <to_trans_date>#{date_for_transaction}</to_trans_date>
                    <print_format>#{name.value}</print_format>
                    <company_id>#{company_id}</company_id>
                   </params>
    })

我的问题是,为什么&#39;数据&#39;表现得像哈希,就像&name; value.value&#39;。

这样的实现

由于

1 个答案:

答案 0 :(得分:1)

find_by_sql正在返回Setup::Type个对象的数组。当您遍历数组时,您将获得使用Setup::Type变量访问的name实例。因此name.value正在发挥作用。

如果您将name更改为type_obj,则会更清楚,

data.each do |type_obj|
  xml  =  Hpricot::XML(%{
                   <params>
                    <from_trans_date>#{date_for_transaction}</from_trans_date>
                    <to_trans_date>#{date_for_transaction}</to_trans_date>
                    <print_format>#{type_obj.value}</print_format>
                    <company_id>#{company_id}</company_id>
                   </params>
    })

这来自find_by_sql的文档。可能有帮助。

  

对您的数据库执行自定义SQL查询并返回所有   结果。结果将作为包含列的数组返回   请求封装为您调用此方法的模型的属性   从。如果您调用Product.find_by_sql,那么结果将是   在具有您在中指定的属性的Product对象中返回   SQL查询。