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

时间:2013-06-26 06:57:25

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2 rails-console

我有一个现有的远程mysql数据库,我试图从我的rails应用程序访问它我在我的database.yml中有这个 发展:

 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文件中看到完整的db结构。

3 个答案:

答案 0 :(得分:4)

对于控制台中的那个,您可以编写像

这样的代码
rails g model City

它将为您创建城市模型。如您所说,您有现有表,因此您不需要通过上述语法生成的迁移。因此,您应该从db / migrate。

中删除生成的迁移

或者你可以做一件事只需在app / models中添加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

希望它对您有用:)

答案 1 :(得分:0)

您当然可以在mysql数据库中访问您的数据,但为了将其用作对象表示,您需要创建与您的数据相关联的model

class City < ActiveRecord::Base
end

这样ActiveRecord将为您完成艰苦的工作,以便将您的对象“链接”到数据库中的数据(假设模型名称正确,此处您应该有一个名为{{1}的表})。

然后,您就可以从rails控制台获取城市

cities

有关ActiveRecord的更多信息,请参阅http://guides.rubyonrails.org/active_record_querying.html

答案 2 :(得分:0)

万一遇到任何人,请确保仔细检查您的模型。我手动创建了它们,但忘记了让Active Record知道我的模型。

我有:

class Currency
  ...
end

您需要将其更改为显示

class Currency < ApplicationRecord
  ...
end

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