ActiveRecords的错误

时间:2013-07-06 20:31:04

标签: ruby activerecord

我无法从ActiveRecord的缓存中删除有关表和列的信息。 我在没有Rails的情况下使用ActiveRecord for Ruby。

require 'active_record'
ActiveRecord::Base.establish_connection(
    :adapter => "mysql2",
    :database  => #
    :password => #
)   
class Person < ActiveRecord::Base
  belongs_to :peoples
end
enter code here
class Persons < ActiveRecord::Base
  belongs_to :peoples
end

class People < ActiveRecord::Base
  has_many :persons
end


Person.new

ActiveRecord::StatementInvalid: Mysql2::Error: Table 'vkusno.people' doesn't exist: SHOW FULL FIELDS FROM `people`'

Persons.new
ActiveRecord::StatementInvalid: Mysql2::Error: Table 'vkusno.persons' doesn't exist: SHOW FULL FIELDS FROM `persons`'

但我尝试连接数据库而没有一些表和列。

在我在数据库中创建一个表之前,“人,人,人,人”,但是我丢弃了所有表并重新启动了我的服务器几次。

如果我将我的数据库更改为sqlite,我会得到一些不存在的表,我正在工作并放弃那些表。

我如何修理它?

UPD

ActiveRecord::Base.logger = Logger.new(STDOUT)

class AddFirst < ActiveRecord::Migration
  def up
    create_table :persons do |t|
      t.integer :idd
      t.string :name
      t.string :href
      t.string :sex
      t.string :country
      t.string :city
      t.boolean :can_message
      t.boolean :can_wall
      t.string :photo
      t.boolean :is_friend
      t.boolean :is_client
    end
    create_table :people do |x|
      x.integer :id_general
      x.string :description
    end
  end
  def down
    drop_table :persons
    drop_table :people
  end
  def keys
    add_column :persons, :peoples_id, :integer
    add_index :persons, :peoples_id
  end
end

> AddFirst.new.up
-- create_table(:persons)
CREATE TABLE `persons` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `idd` int(11), `name` varchar(255), `href` varchar(255), `sex` varchar(255), `country` varchar(255), `city` varchar(255), `can_message` tinyint(1), `can_wall` tinyint(1), `photo` varchar(255), `is_friend` tinyint(1), `is_client` tinyint(1)) ENGINE=InnoDB

-- create_table(:people)
CREATE TABLE `people` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `id_general` int(11), `description` varchar(255)) ENGINE=InnoDB
=> {}

AddFirst.new.keys
-- add_column(:persons, :peoples_id, :integer)
ALTER TABLE `persons` ADD `peoples_id` int(11)
-- add_index(:persons, :peoples_id)
CREATE INDEX `index_persons_on_peoples_id` ON `persons` (`peoples_id`) 
=> nil



> Person.new
=> #<Person id: nil, id_general: nil, description: nil>
> Persons.new
=> #<Persons id: nil, idd: nil, name: nil, href: nil, sex: nil, country: nil, city: nil, can_message: nil, can_wall: nil, photo: nil, is_friend: nil, is_client: nil>
> People.new
=> #<People id: nil, id_general: nil, description: nil>

1 个答案:

答案 0 :(得分:0)

了解类名如何映射到表名

您需要了解ActiveRecord如何决定模型的表名。

如果您有班级Person,则默认表格名称为people。 AR通过在类名上调用tableize方法来完成此操作,如下所示:

'Person'.tableize  # => "people"

Person.name.tableize   # => "people"

这意味着,对于Person类,您应该创建people表(除非您要覆盖默认值)。确保拼写正确; peoples工作。

这也意味着你应该拥有另一个类People,因为默认的表名也是people

'People'.tableize  #=> "people"

会发生冲突,或者充其量,你会让自己感到困惑。

使用persons作为表名称并不是一个好主意,除非您覆盖默认值。这是因为AR不会生成persons作为类Person的表名。

我强烈建议您在尝试其他任何内容之前阅读并理解ActiveRecord basics guide

模拟现实世界

我也不确定您希望Person属于:peoples的原因。

你能描述一下你想要代表的真实场景吗?

示例:

  • 一个人有很多书
  • 某个人属于某个组织。