Rails 架构创建问题
我正在使用 Jruby 和 Rails 2.2.2。 我的问题是我的迁移未正确写入数据库模式。
这是我的迁移:
class CreateNotes < ActiveRecord::Migration
def self.up
create_table(:notes, :options => 'ENGINE=MyISAM') do |t|
t.string :title
t.text :body
t.timestamps
end
execute "alter table notes ADD FULLTEXT(title, body)"
end
这是它在 schema.rb 中生成的内容
create_table "notes", :force => true do |t|
t.string "title"
t.text "body"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "notes", ["title", "body"], :name => "title"
我有两个问题:
- 如何将
'ENGINE=MyISAM'
放入架构中? - 为什么我的执行语句变成了
add_index "notes", ["title", "body"], :name => “标题”? 以及如何强制迁移将其保留为执行语句?
感谢克里斯蒂安·莱斯库耶的回答。 然而,当我尝试这样做时,一切都没有改变。 我取消了 config.active_record... 行的注释,但是我的架构没有改变。 我已经在 jruby 和 ruby 1.8.6 上尝试过使用 Rails 2.2.2 和 Edge Rails,并且模式没有变化。 谁能告诉我我做错了什么?
I am using Jruby and rails 2.2.2. My problem is I have a migration that is not being correctly written to the database schema.
Here is my migration:
class CreateNotes < ActiveRecord::Migration
def self.up
create_table(:notes, :options => 'ENGINE=MyISAM') do |t|
t.string :title
t.text :body
t.timestamps
end
execute "alter table notes ADD FULLTEXT(title, body)"
end
Here is what it produces on in schema.rb
create_table "notes", :force => true do |t|
t.string "title"
t.text "body"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "notes", ["title", "body"], :name => "title"
I have two question:
- How do I get
'ENGINE=MyISAM'
into the schema? - Why did my execute statement become
add_index "notes", ["title", "body"], :name => "title"
? and how do I force migrations to leave it as an execute statement?
Thanks to Christian Lescuyer for the answer. However, when I tried this nothing changed. I uncommented the config.active_record... line but, my schema has not changed. I have tried this in jruby and on ruby 1.8.6 with rails 2.2.2 and edge rails and there is not changes in the schema. Can anybody tell me what I am doing wrong?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
设置,我也希望在“rake db:migrate”之后看到一个新的 .sql 文件出现
一旦我在 config/environment.rb 中
。 然而,显然这并不是它的工作原理。 我必须明确执行此操作才能获取 db/[development|test|product]_struct.sql 文件:
I too expected to see a new .sql file appear after a "rake db:migrate", once I set
in config/environment.rb.
Apparently that's not how it works, however. I have to do this explicitly to get a db/[development|test|production]_structure.sql file:
由于我使用外键约束,因此我使用 SQL 格式进行迁移。 在environment.rb中:
As I use foreign key constraints, I use the SQL format for migrations. In environment.rb:
只是对 Rails 3(目前为 beta 4)的更新 - Christian 的解决方案仍然是正确的,只有放置该行的正确位置位于
config/application.rb
中,在 < code>Application 类,应在以 Rails 项目命名的模块中定义。Just an update for those on Rails 3 (beta 4, currently) - Christian's solution is still correct, only the correct place to put the line is in
config/application.rb
, under the scope of theApplication
class which should be defined in a module named after your Rails project.基督徒是对的。
执行
config.active_record.schema_format = :sql
在environment.rb中
但随后您必须使用不同的架构转储格式和文件位置。 尝试进行迁移并查找“schema.sql”而不是 schema.rb
所有这一切的原因是方案文件的要点是数据库非特定(适用于所有类型的数据库)文件。 因此,当您通过不支持的执行语句使用仅适用于 mysql 的功能时,它们不能被硬塞到 schema.rb 中
christian is right.
do
config.active_record.schema_format = :sql
in environment.rb
but then you have to use a different schema dump format and file location. try doing your migration and looking for "schema.sql" instead of scehema.rb
the reason for all of this is that the point of the scheme file is a database unspecific (works for all types of databases) file. so when you use features which only work on mysql through an unsupoorted execute statement, they can't be shoehorned in to schema.rb
要使用 SQL 变体进行测试(而不是 schema.rb),您需要使用
我们的模式使用 UUID (uuid gem) 以及 Red Hill on Rails (RHoR) 不错的 FK 插件。 不幸的是,FK 需要只能在迁移中使用 EXECUTES 添加的 PK。
众所周知,这些执行不会进入 schema.rb; 但是,对于无法使用 schema.rb 的应用程序,很难找到 db:test:prepare 的 rake 替代品。
To use the SQL variant for testing (instead of schema.rb), you'll need to use
Our schema uses UUIDs (uuid gem) and also Red Hill on Rails (RHoR) nice FK plug-in. Unfortunately, the FKs require PKs that can only be added using EXECUTES in the migrations.
It's well known that these executes do not make it to the schema.rb; however, it was harder to find the rake alternative to db:test:prepare for apps that cannot use schema.rb.
以下monkeypatch解决了模式转储器(Rails 3.2)的全文索引问题和数据库引擎选项。 您可以将其放入
config/initializers/
(例如schema_dumper_monkeypatch.rb
):The following monkeypatch solves both the FULLTEXT index issue and DB engine option for your schema dumper (Rails 3.2). You can put it in
config/initializers/
(e.g.schema_dumper_monkeypatch.rb
):