无法在rails控制台中访问Mysql模型。

问题描述 投票:2回答:3

 development:
  adapter: mysql2
  encoding: utf8
  database: mydb
  username: myusername
  password: !@#$%@!
  host: IP for my DB
  port: 3306
  pool: 5
  socket: /tmp/mysql.sock  
  timeout: 5000

当我在rails控制台运行以下命令时

ActiveRecord::Base.connection.tables。

它列出了所有可用的表,但当我试图访问模型时,它给我以下错误。

City
NameError: uninitialized constant City from (irb):12
    from /home/shreyas/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.11/lib/rails/commands/console.rb:47:in `start'
    from /home/shreyas/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.11/lib/rails/commands/console.rb:8:in `start'
    from /home/shreyas/.rvm/gems/ruby-1.9.3-p194/gems/railties-3.2.11/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

任何建议,我做错了什么?我想在我的应用程序中访问远程数据库,目前还没有创建任何模型。我需要创建所有的模型吗?我可以在我的schema.rb文件中看到完整的数据库结构。

ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2 rails-console
3个回答
4
投票

在控制台中,你可以写这样的代码。

rails g model City

它将为你创建城市模型。正如你所说的,你有现有的表,所以你不需要上述语法生成的迁移。所以你应该删除dbmigrate中生成的迁移。

或者你可以做一件事,就是在appmodels中添加city.rb文件。然后添加以下代码

class City < ActiveRecord::Base
   # if your table name is cities, then you don't need to do any thing.
   # if your table name is something else rather than cities then place the following commented code
   # self.table_name = 'your_existing_city_table_name'

   # then you have to add columns of the table as attr_accessible. for e.g. you have name, state_id in there
   attr_accessible :name, :state_id
end

希望它能为你工作:)


0
投票

当然,您可以在您的 mysql 数据库,但为了使用它作为对象表示,你需要创建一个 model 与您的数据相关联。

class City < ActiveRecord::Base
end

这样一来 ActiveRecord 将为您做艰苦的工作,以便将您的对象 "链接 "到您的数据库中的数据(假设模型的名称是正确的,这里您应该有一个名为 cities).

然后,你就可以从rails控制台中获取城市。

City.all

关于ActiveRecord的更多信息,请参考以下内容 http:/guides.rubyonrails.orgactive_record_querying.html。


0
投票

如果有人遇到这种情况,一定要仔细检查你的模型。我是手动创建的,忘了让Active Record知道我的模型。

我有。

class Currency
  ...
end

你需要改变这一点,以显示

class Currency < ApplicationRecord
  ...
end

可能会节省你的调试时间:)

© www.soinside.com 2019 - 2024. All rights reserved.