Ruby on rails 在Rails控制台中发生意外行为
轨道3.2 我正在一个Rails控制台会话中,我正在尝试通过id查找一个公司。我有一个带有id列的公司表 是的 以下是我在控制台中得到的信息:Ruby on rails 在Rails控制台中发生意外行为,ruby-on-rails,rails-activerecord,Ruby On Rails,Rails Activerecord,轨道3.2 我正在一个Rails控制台会话中,我正在尝试通过id查找一个公司。我有一个带有id列的公司表 是的 以下是我在控制台中得到的信息: Company Load (161.2ms) SELECT `companies`.* FROM `companies` WHERE `companies`.`slug` = '1403045688' LIMIT 1 EXPLAIN (162.2ms) EXPLAIN SELECT `companies`.* FROM `companies`
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搜索,而不是先用slug搜索吗?为什么它看起来很困惑,想要解释这个问题
当您使用find方法时,它将同时使用slug和id列来查找记录,如果您希望只按id搜索记录,则需要将代码更改为类似以下内容:
company=company.whereid:1403045688.take
当您使用find方法时,它将同时使用slug和id列来查找记录,如果您希望只按id搜索记录,则需要将代码更改为类似以下内容:
company=company.whereid:1403045688.拿着你好像在用友好的宝石,是吗?如果是,您需要更新gem,因为从V5开始禁用查找器覆盖。当我在Gemfile.lock中grep for friendly_id时,我得到:friendly_id~>4.0,>=4.0.9 friendly_id 4.0.10.1 friendly_id您建议我使用gem的5.0版本吗?是的,如果不希望主键被slug.覆盖的默认行为,则始终需要指定要查询的列。您可能还需要更改其他位置的代码,因为对slug的调用已更改,例如User.friendly.findparams[:id]参见friendly_id 5具有ActiveRecord 4依赖项。我使用的是Rails 3.2。哦,是的……那么你可能不得不忍受这一点……你似乎使用了友好的id gem,是吗?如果是,您需要更新gem,因为从V5开始禁用查找器覆盖。当我在Gemfile.lock中grep for friendly_id时,我得到:friendly_id~>4.0,>=4.0.9 friendly_id 4.0.10.1 friendly_id您建议我使用gem的5.0版本吗?是的,如果不希望主键被slug.覆盖的默认行为,则始终需要指定要查询的列。您可能还需要更改其他位置的代码,因为对slug的调用已更改,例如User.friendly.findparams[:id]参见friendly_id 5具有ActiveRecord 4依赖项。我使用的是Rails 3.2.Ohh是的……那么你可能不得不忍受这一点……为什么要使用Company.whereid:1403045688而不是Company.find_by_id 1403045688?因为在5.0版本之前,FriendlyId总是会覆盖默认的finder方法来执行友好查找,而find_by_id则会被覆盖以首先按slug列进行搜索,如果没有找到记录,则id将用于搜索。为什么要使用Company.whereid:1403045688而不是Company.find_by_id 1403045688?因为在版本5.0之前,FriendlyId会重写默认的finder方法来执行友好查找,所以find_by_id会被重写为首先按slug列进行搜索,若并没有找到记录,那个么id将用于搜索。
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">