所以,我试图让redmine_backlogs与SQL服务器一起工作。[我们使用的是SQL Server而不是SQLite,以更好地扩展]我不是一个Ruby程序员,但我真的想为我的团队这个插件,因为我们积极使用Redmine的几个项目。
在阅读了一些Ruby教程之后,我已经设法做了一些修改,并正确地安装和迁移了插件[它看起来]。
在Redmine的插件设置界面[管理中],它显示迁移不成功。尽管所有的列表项都是绿色的,并且迁移似乎有效。什么好主意吗?
我所做的更改是绕过Active records处理直接SQL查询的方式的可疑问题。
这是我做的改动-
错误#1 -
C:ProjectsRedmineredmine-2.3.2>rake redmine:plugins:migrate
Migrating redmine_backlogs (Redmine Backlogs)...
== AddStoryPositions: migrating ==============================================
-- execute("select max(position) from issues")
-> 0.0020s
-> -1 rows
rake aborted!
An error has occurred, this and all later migrations canceled:
undefined method `each' for -1:FixnumC:/Projects/Redmine/redmine-2.3.2/plugins/redmine_backlogs/db/migrate/026_add_story_positions.rb:10:in `up'
FIX #1 -
直接查询不能正常工作与sqladapter [TinyTds + Active Record]026年_add_story_positions.rb
class AddStoryPositions < ActiveRecord::Migration
def self.up
# Rails doesn't support temp tables, mysql doesn't support update
# from same-table subselect
unless RbStory.trackers.size == 0
max = 0
dbconfig = YAML.load_file(File.join(File.dirname(__FILE__), '../../../../config/database.yml'))#[Rails.env]['username']
if dbconfig[Rails.env]['adapter'] == 'sqlserver' then
database = dbconfig[Rails.env]['database']
dataserver = dbconfig[Rails.env]['dataserver']
mode = dbconfig[Rails.env]['mode']
port = dbconfig[Rails.env]['port']
username = dbconfig[Rails.env]['username']
password = dbconfig[Rails.env]['password']
client = TinyTds::Client.new(
:database => database,
:dataserver => dataserver,
:mode => mode,
:port => port,
:username => username,
:password => password)
client.execute("select max(position) from issues").each{|row| max = row[0]}
client.execute "update issues
set position = #{max} + id
where position is null and tracker_id in (#{RbStory.trackers(:type=>:string)})"
else
execute("select max(position) from issues").each{|row| max = row[0]}
execute "update issues
set position = #{max} + id
where position is null and tracker_id in (#{RbStory.trackers(:type=>:string)})"
end
end
end
def self.down
puts "Reverting irreversible migration"
end
end
错误# 2 rake流产!发生了一个错误,这次和以后所有的迁移都取消了:
TinyTds::Error: ALTER TABLE ALTER COLUMN position失败,因为一个或多个对象访问了该列。: ALTER TABLE [issues] ALTER COLUMN [position]/Projects/Redmine/Redmine -2.3.2/plugins/redmine_backlogs/db/migrate/033_unique_positions. int NOT NULLC:rb: 30:"起来"
修复# 2
033 _unique_positions.rb #SQLServer cannot change the type of an indexes column, so it must be dropped first
remove_index :issues, :position
change_column :issues, :position, :integer, :null => false
add_index :issues, :position
错误# 3 rake流产!未定义的方法each' for -1:Fixnum
C:/Projects/Redmine/redmine-2.3.2/plugins/redmine_backlogs/lib/backlogs_setup.rb:155:in
迁移?'
修复# 3
def migrated?
available = Dir[File.join(File.dirname(__FILE__), '../db/migrate/*.rb')].collect{|m| Integer(File.basename(m).split('_')[0].gsub(/^0+/, ''))}.sort
return true if available.size == 0
available = available[-1]
ran = []
dbconfig = YAML.load_file(File.join(File.dirname(__FILE__), '../../../config/database.yml'))#[Rails.env]['username']
if dbconfig[Rails.env]['adapter'] == 'sqlserver' then
database = dbconfig[Rails.env]['database']
dataserver = dbconfig[Rails.env]['dataserver']
mode = dbconfig[Rails.env]['mode']
port = dbconfig[Rails.env]['port']
username = dbconfig[Rails.env]['username']
password = dbconfig[Rails.env]['password']
client = TinyTds::Client.new(
:database => database,
:dataserver => dataserver,
:mode => mode,
:port => port,
:username => username,
:password => password)
client.execute("select version from schema_migrations where version like '%-redmine_backlogs'").each{|m|
ran << Integer((m.is_a?(Hash) ? m.values : m)[0].split('-')[0])
}
else
Setting.connection.execute("select version from schema_migrations where version like '%-redmine_backlogs'").each{|m|
ran << Integer((m.is_a?(Hash) ? m.values : m)[0].split('-')[0])
}
end
return false if ran.size == 0
ran = ran.sort[-1]
return ran >= available
end
module_function :migrated?
我使用了错误的where子句-这是正确的,我一定是在调试时重写了。"% -redmine_backlogs"
我以前不能回答我自己的问题,但现在我可以了。上面的代码经过测试并运行正常。从那以后,我一直在Windows上使用MS SQL成功地运行积压任务。