我正在使用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>
如果您了解问题,请提供一些帮助。感谢。
答案 0 :(得分:2)
您收到此错误是因为您正在呼叫@device.row_id
,其中@device
为Cabinet.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