我不是从查询中得到一个结果,我应该从中得到结果

时间:2013-04-03 16:49:12

标签: jquery ruby-on-rails

我正在使用rails-jquery-autocomplete以这样的形式填写cabinet_name

<%= autocomplete_field_tag :cabinet_name, '', cabinets_autocomplete_cabinet_name_path %>

与其他数据一起,这里是传递给设备控制器的参数:

{"utf8"=>"✓",
"authenticity_token"=>"/0yFGrlBy0y+2ksTkQN50Dmfpw7ZWBKsO2zswAigJZI=",
"device"=>{"name"=>"Test dropdown",
"device_model_id"=>"621",
"device_unit_count"=>"1",
 "position"=>"1",
 "row_id"=>"1"},
 "cabinet_name"=>"0055-COMM-ANNEX-C3",
 "commit"=>"Create Device"}

正如您所看到的,cabinet_name哈希中肯定传递了device。以下是devices_controller

中的代码
def create
  if params[:cabinet_name]
    @cabinet = Cabinet.where("name LIKE ? ", params[:cabinet_name])
  else
    @cabinet = Cabinet.find(params[:device][:cabinet_id])
  end
...
 @device.row_id = @cabinet.row_id

这是根据命令行输出运行的查询,请注意:

  ←[1m←[35mCabinet Load (2.9ms)←[0m  SELECT `cabinets`.* FROM `cabinets` WHERE (
name LIKE '0055-COMM-ANNEX-C3' )

这是我运行的手动查询和结果,显示了一个内阁记录的结果:

mysql> select `cabinets`.* from `cabinets` where name like '0055-COMM-ANNEX-C3'


---------------+
| id   | name               | row_id | data_center_id | cabinet_type_id | creat
d_at          | updated_at          | row_name | cabinet_name | capacity_used |
not_cabinet | grid_location_name | grid_location_id | is_rack | alias_name
   | room_id | mark_review | mark_validated | mark_audit | last_audit_note | ma
k_deleted | purpose | total_power_kpm | total_max_power_kpm | total_heat_btu |
otal_max_heat_btu | total_heat_kpm | total_max_heat_kpm | total_spec_ratings |
ean_efficiency |

------------------+----------------+--------------------+--------------------+-
---------------+
| 1389 | 0055-COMM-ANNEX-C3 |   NULL |              3 |               1 | 2012-
1-05 21:55:23 | 2012-11-21 16:21:34 | C3       | C3           |             2 |
       NULL | C3                 |             2287 |       0 | 0055-COMM-ANNEX
C3 |       4 |        NULL |           NULL |       NULL | NULL            |
     NULL | NULL    |              42 |                  64 |            200 |
              280 |              8 |                 10 |                  0 |
          NULL |

------------------+----------------+--------------------+--------------------+-
---------------+
1 row in set (0.00 sec)

这是浏览器抛出的错误,现在选择了Cabinet:

undefined method `row_id' for #<ActiveRecord::Relation:0x5845368>

如果您了解问题,请提供一些帮助。感谢。

3 个答案:

答案 0 :(得分:2)

您收到此错误是因为您正在呼叫@device.row_id,其中@deviceCabinet.where("name LIKE ? ", params[:cabinet_name])。如果您想要第一个机柜名称为params[:cabinet_name]的机柜,请将其更改为:

Cabinet.where("name LIKE ? ", params[:cabinet_name]).first

然后您可以按预期调用row_id。基本上,您在row_id上呼叫ActiveRecord::Relation,而不是Cabinet的实例。

答案 1 :(得分:1)

    @cabinet = Cabinet.where("name LIKE ? ", params[:cabinet_name])

该行返回结果集合,因此当您尝试从集合中获取ID时,您的代码就会被轰炸。

您可以执行以下操作:

    @cabinet = Cabinet.where("name LIKE ? ", params[:cabinet_name]).first

获取第一个结果。

答案 2 :(得分:1)

.where会返回一个Array而不是一个Object,您希望它返回一个Object,并且您匹配整个字符串,因此不需要如果是这种情况,请使用like

所以

假设橱柜名称是唯一的,您需要完全匹配,您应该使用以下

@cabinet = Cabinet.find_by_name(params[:cabinet_name])

OR

或者如果您想要第一个结果,您希望获得多个结果而不是您需要获得的任何结果

@cabinet = Cabinet.where("name LIKE ? ", params[:cabinet_name]).first