1

在触发 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>

在对数据使用“检查”功能时,它会重新运行

[#<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。

但是,据我推测,这在用作“哈希”时效果很好,

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>
    })

我的问题是,为什么“数据”的行为就像一个哈希,根据像“name.value”这样的实现。

谢谢

4

1 回答 1

1

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

如果你改成nametype_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 查询中指定的属性。

于 2015-06-13T16:16:34.417 回答