在Rails控制台中出现意外的行为

问题描述:

Rails 3.2在Rails控制台中出现意外的行为

我在Rails控制台会话中,并试图通过id找到公司。我有一个公司的表,一个id列。

我做

company = Company.find_by_id("1403045688") 

下面是我在控制台得到:

Company Load (161.2ms) SELECT `companies`.* FROM `companies` WHERE `companies`.`slug` = '1403045688' LIMIT 1 
    EXPLAIN (162.2ms) EXPLAIN SELECT `companies`.* FROM `companies` WHERE `companies`.`slug` = '1403045688' LIMIT 1 
EXPLAIN for: SELECT `companies`.* FROM `companies` WHERE `companies`.`slug` = '1403045688' LIMIT 1 
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra            | 
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+ 
| 1 | SIMPLE  | NULL | NULL | NULL   | NULL | NULL | NULL | NULL | Impossible WHERE noticed after reading const tables | 
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+ 
1 row in set (0.20 sec) 

    Company Load (1.6ms) SELECT `companies`.* FROM `companies` WHERE `companies`.`id` = '1403045688' LIMIT 1 
    EXPLAIN (80.7ms) EXPLAIN SELECT `companies`.* FROM `companies` WHERE `companies`.`id` = '1403045688' LIMIT 1 
EXPLAIN for: SELECT `companies`.* FROM `companies` WHERE `companies`.`id` = '1403045688' LIMIT 1 
+----+-------------+-----------+-------+---------------+---------+---------+-------+------+-------+ 
| id | select_type | table  | type | possible_keys | key  | key_len | ref | rows | Extra | 
+----+-------------+-----------+-------+---------------+---------+---------+-------+------+-------+ 
| 1 | SIMPLE  | companies | const | PRIMARY  | PRIMARY | 182  | const | 1 |  | 
+----+-------------+-----------+-------+---------------+---------+---------+-------+------+-------+ 
1 row in set (0.08 sec) 

=> #<Company id: "1403045688", name: "AAA Electric", slug: "aaa-electric-inc", created_at: "2014-06-17 22:54:48", updated_at: "2016-03-12 05:13:26"> 

难道不应该直行通过ID进行搜索,而不是首先尝试使用塞一看,?为什么它似乎很困惑,并希望解释查询?

+0

您似乎使用'friendly_id'宝石,是吗?如果是的话,你需要更新创业板自从V5 –

+0

取景压倒一切被禁止当我用grep在Gemfile.lock的friendly_id,我得到:friendly_id(〜> 4.0,> = 4.0.9) friendly_id(4.0.10.1) friendly_id 你是否建议我使用gem版本5.0? – EastsideDeveloper

+0

是的,如果您不希望primary_key被slug覆盖的默认行为。您总是需要指定您要查询的列。您可能还需要在其他位置更改代码,因为调用slug已发生变化,例如'User.friendly.find(PARAMS [:ID])'看到https://github.com/norman/friendly_id/blob/master/README.md –

Prior to version 5.0, FriendlyId overrode the default finder methods to perform friendly finds all the time

它将使用两列slugid当您使用find方法,如果你想它只是通过ID搜索找到记录,您需要更改代码是这样的:

company = Company.where(id: "1403045688").take

+0

为什么会Company.where (id:“1403045688”)而不是Company.find_by_id(“1403045688”)? – EastsideDeveloper

+1

因为**此前5.0版本,FriendlyId推翻默认finder方法进行友好发现所有的时间**,'find_by_id'是重写通过塞柱首先进行搜索,那么如果记录没有找到,那么ID会被用来搜索。 – Thanh