0

我正在使用 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)

这是浏览器抛出的错误,说明现在选择了内阁:

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

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

4

3 回答 3

2

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

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

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

于 2013-04-03T16:52:10.050 回答
1
    @cabinet = Cabinet.where("name LIKE ? ", params[:cabinet_name])

该行返回一个结果集合,因此当您尝试从集合中获取 id 时,您的代码正在爆炸。

您可以执行以下操作:

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

抢到第一个结果。

于 2013-04-03T16:53:35.530 回答
1

.where返回一个Arraynot a single Object,您期望它返回一个 single ,并且您正在匹配完整的字符串,因此如果是这种情况,则Object无需使用,like

所以要么

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

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

或者

或者,如果您期望获得多个结果而不是获得想要处理的任何结果(如果您想要第一个结果)

@cabinet = Cabinet.where("name LIKE ? ", params[:cabinet_name]).first
于 2013-04-03T16:57:26.793 回答