ActiveRecord find()似乎只能使用符号参数

时间:2015-05-13 23:42:16

标签: ruby-on-rails activerecord

我正在针对现有数据库构建新的Rails应用程序。到目前为止我有一个模型看起来像:

class User < ActiveRecord::Base
  self.table_name = 'user'
  self.primary_key = 'name'
end

当我跳入控制台并尝试User.find("Bob")并获得

User Load (23.4ms)  SELECT  `user`.* FROM `user` WHERE `user`.`name` = '--- !ruby/object:ActiveRecord::StatementCache::Substitute {}\n' LIMIT 1
ActiveRecord::RecordNotFound: Couldn't find User with 'name'=Bob
        from /var/lib/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/core.rb:155:in `find'
        from (irb):3
        from /var/lib/gems/2.1.0/gems/railties-4.2.1/lib/rails/commands/console.rb:110:in `start'
        from /var/lib/gems/2.1.0/gems/railties-4.2.1/lib/rails/commands/console.rb:9:in `start'
        from /var/lib/gems/2.1.0/gems/railties-4.2.1/lib/rails/commands/commands_tasks.rb:68:in `console'
        from /var/lib/gems/2.1.0/gems/railties-4.2.1/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
        from /var/lib/gems/2.1.0/gems/railties-4.2.1/lib/rails/commands.rb:17:in `<top (required)>'
        from bin/rails:4:in `require'
        from bin/rails:4:in `<main>'

尝试User.find('Bob')让我得到同样的东西。

如果我尝试User.find(:Bob)我会找回正确的记录。

这也意味着rake生成的控制器和路由不起作用,转到localhost:3030/users/bob让我

ActiveRecord::RecordNotFound in UsersController#show
Couldn't find User with 'name'=bob

我无法更改数据库,因此无法添加密钥或更改现有主键。

我是否缺少明显的模型组件或数据库设置?

2 个答案:

答案 0 :(得分:1)

要建立@ papirtiger的评论,我建议你消除:

self.table_name = 'user'    # this is the default table name already
self.primary_key = 'name'   # stick with PK ID generated in migration

然后,在您的控制台中,您可以使用以下命令:

>> find_by(name: 'Bob')

以及here所描述的许多其他内容。

答案 1 :(得分:0)

不确定我是否愿意承认这种级别的麻木,但事实证明问题是

UPPERCASE_COLUMN_NAMES

我需要做的只是

class User < ActiveRecord::Base
  self.table_name = 'user'
  self.primary_key = 'NAME'
end

我仍然很好奇为什么符号论据起作用,但目前我的问题已经解决了。我的意思是,我仍然有成为一个傻瓜的问题,但至少我的模型工作。