我们开始基于Ruby on Rails的一个项目。我们使用Perl和PostgreSQL函数的工作,并与Rails和活动记录我从来没见过,我们应该如何在PostgreSQL的创建功能,并保持纪录,活动记录和模式。
我知道我们可以在PostgreSQL的手动创建它,但“魔术”与Active Record是数据库可以与所有的模型来重新创建。
有没有办法使用Rails创建PostgreSQL的功能,并保持它的型号?
你的问题的这一部分:
我知道我们可以在PostgreSQL的手动创建它,但“魔术”与Active Record是数据库可以与所有的模型来重新创建。
告诉我,你真正寻找一种方式来整合PostgreSQL函数与正常的Rails迁移过程和Rake任务,例如db:schema:load
。
添加和删除迁移的功能很简单:
def up
connection.execute(%q(
create or replace function ...
))
end
def down
connection.execute(%q(
drop function ...
))
end
您需要使用的,而不是单一的up
方法单独down
和change
方法,因为ActiveRecord的将不知道如何运用更别说扭转的功能创建。并使用connection.execute
到原始函数定义喂到PostgreSQL。您也可以使用其内部reversible
一个change
做到这一点:
def change
reversible do |dir|
dir.up do
connection.execute(%q(
create or replace function ...
))
end
dir.down do
connection.execute(%q(
drop function ...
))
end
end
end
但我发现,比up
和down
噪音。
然而,schema.rb
以及与schema.rb
工作通常Rake任务(如db:schema:load
和db:schema:dump
)将不知道如何处理PostgreSQL函数和其他东西,ActiveRecord的不理解做。有解决这个虽然是这样,你可以选择通过设置使用structure.sql
文件而不是schema.rb
:
config.active_record.schema_format = :sql
在config/application.rb
文件。在此之后,db:migrate
会写,而不是一个db/structure.sql
文件db/schema.rb
(这只是你的PostgreSQL数据库的原始SQL转储没有你的数据)。您还可以使用不同的Rake任务与structure.sql
工作:
db:structure:dump
代替db:schema:dump
db:structure:load
代替db:schema:load
其他的一切应该工作一样。
这种方法,您还可以使用其他的东西在你的数据库的ActiveRecord不会明白:CHECK约束,触发器,非笨笨列缺省值,...
如果你唯一的要求是在你的Rails应用程序的某个地方创建它们,这是可能的,通过ActiveRecord::Base.connection.execute
,你可以用它来执行原始的SQL查询。
stmt = 'CREATE FUNCTION...'
ActiveRecord::Base.connection.execute stmt
然后,您可以使用ActiveRecord::Base.connection.execute
以及调用函数(我想像你会在你的模型来处理这个方法)。