我无法从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>
答案 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
的原因。
你能描述一下你想要代表的真实场景吗?
示例: