小编knu*_*nut的帖子

使用Rmagick首先调整高度

我正在尝试使用Rmagick调整图像大小,如果我使用该resize_to_fit方法始终首先调整高度,则优先选择宽度,但似乎我的大多数图像都首先调整为宽度.无论如何使用该resize_to_fit方法告诉它"更喜欢高度超过宽度"?

rmagick

5
推荐指数
2
解决办法
2975
查看次数

使用UNION和Sequel

我想定义一个像这样的SQL命令:

SELECT * FROM WOMAN
UNION
SELECT * FROM MEN
Run Code Online (Sandbox Code Playgroud)

我尝试使用Ruby + Sequel中的以下代码序列来定义它:

require 'sequel'

DB = Sequel::Database.new()
sel = DB[:women].union(DB[:men])
puts sel.sql
Run Code Online (Sandbox Code Playgroud)

结果是(我在结果上做了一些漂亮的打印):

SELECT * FROM (
    SELECT * FROM `women` 
    UNION 
    SELECT * FROM `men`
) AS 't1'
Run Code Online (Sandbox Code Playgroud)

还有一个(多余的?)SELECT.

如果我UNION在此代码示例中定义了多个

sel = DB[:women].union(DB[:men]).union(DB[:girls]).union(DB[:boys])
puts sel.sql
Run Code Online (Sandbox Code Playgroud)

我得到了更多多余的SELECT.

SELECT * FROM (
  SELECT * FROM (
    SELECT * FROM (
      SELECT * FROM `women` 
      UNION 
      SELECT * FROM `men`
    ) AS 't1' 
    UNION 
    SELECT * FROM …
Run Code Online (Sandbox Code Playgroud)

ruby sql union sequel

4
推荐指数
1
解决办法
1475
查看次数

如何在ruby中创建没有临时文件的zip文件?

我创建了一个带有一些生成内容的zip文件(换句话说:存档中的文件不存在,内容是在我的脚本中构建的).

我使用类似这样的脚本:

#~ gem 'rubyzip', '=1.1.0'
require 'zip/zip'

zipname = 'test.zip'
File.delete(zipname) if File.exists?(zipname) #delete previous version

Zip::ZipFile.open(zipname, Zip::ZipFile::CREATE) do |zipfile|
  1.upto(100) do |i| #Just some testfiles with content
    zipfile.get_output_stream("%08i.txt" % i) do |output_entry_stream| #Filename
          output_entry_stream.write("Testcontent %08i" % i)            #generated content
        end
      sleep 1  #sleep some time to see the temporary files
  end   #testdocs
end #ZipFile.open(zipname)
Run Code Online (Sandbox Code Playgroud)

这工作正常,我得到我的拉链内部正确的数据.

但在创建zip时我有很多临时文件.拉链完成时会删除它们,但文件在创建过程中会打扰我.如果进程引发异常,那么我必须手动删除它们.

我有Zip :: VERSION 2.0.2和1.1.0的这种行为(使用gem ruby​​zip)

  • 我可以避免这个临时文件吗?
  • 如果不是:我可以为他们确定(临时)文件夹吗?

ruby zip temporary-files

4
推荐指数
2
解决办法
8304
查看次数

运行Rails控制台时出现Gem :: LoadError

我试图通过执行运行Rails控制台,rails console我收到了该错误

 /home/ahmed/.rvm/gems/ruby-.2.0@global/gems/bundler-.8.2/lib/bundler/runtime.rb:34:in `block in setup': You have already activated spring 1.3.3, but your Gemfile requires spring 1.3.2. Prepending `bundle exec` to your command may solve this. (Gem::LoadError)
  from home/ahmed/.rvm/gems/ruby-.2.0@global/gems/bundler-.8.2/lib/bundler/runtime.rb:19:in `setup'
  from /home/ahmed/.rvm/gems/ruby-2.2.0@global/gems/bundler-1.8.2/lib/bundler.rb:122:in `setup'
  from /home/ahmed/.rvm/gems/ruby-2.2.0@global/gems/bundler-1.8.2/lib/bundler/setup.rb:8:in `<top (required)>'
  from /home/ahmed/.rvm/rubies/ruby-2.2.0/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
  from /home/ahmed/.rvm/rubies/ruby-2.2.0/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
  from /home/ahmed/.rvm/gems/ruby-2.2.0/gems/spring-1.3.3/lib/spring/commands.rb:33:in `<module:Spring>'
  from /home/ahmed/.rvm/gems/ruby-2.2.0/gems/spring-1.3.3/lib/spring/commands.rb:4:in `<top (required)>'
  from /home/ahmed/.rvm/rubies/ruby-2.2.0/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
  from /home/ahmed/.rvm/rubies/ruby-2.2.0/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
  from /home/ahmed/.rvm/gems/ruby-2.2.0/gems/spring-1.3.3/lib/spring/server.rb:9:in `<top (required)>'
  from /home/ahmed/.rvm/rubies/ruby-2.2.0/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:128:in `require'
  from /home/ahmed/.rvm/rubies/ruby-2.2.0/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:128:in `rescue in require'
  from /home/ahmed/.rvm/rubies/ruby-2.2.0/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:39:in `require'
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails

4
推荐指数
1
解决办法
1985
查看次数

比较两个SVN版本与超越比较4

我尝试将两个版本与Beyond Compare 4的文件夹比较进行比较.但是我无法连接我的SVN文件夹,我收到错误.

在此输入图像描述

当我用TortoiseSVN连接到SVN-repository时,我被要求输入用户名和密码,我连接时没有问题.

除了将SCN版本与Beyond Compare 4的文件夹比较进行比较之外,我还需要什么?

svn tortoisesvn beyondcompare beyondcompare4

4
推荐指数
1
解决办法
495
查看次数

解析红宝石中的字符串日期,例如"28-May-10"

我尝试使用解析

Date.parse("28-May-10").to_s
Run Code Online (Sandbox Code Playgroud)

退货0010-5-28(这是2000年!)

我怎样才能让ruby正确地解释两位数的年份.

谷歌有很多字符串到目前为止转换技巧,但大多数处理数字月份而不是"五月".

ruby ruby-on-rails date strptime

3
推荐指数
1
解决办法
2119
查看次数

使用带有require/rescue的单行条件

如果a require不成功,我想避免错误.

我可以这样做:

begin
  require 'unexisting_script' 
rescue LoadError
end
Run Code Online (Sandbox Code Playgroud)

我尝试用一​​行条件做同样的事情:

require 'unexisting_script' rescue LoadError
Run Code Online (Sandbox Code Playgroud)

并得到错误 no such file to load -- unexisting_script (LoadError)

使用其他异常/命令我对单行救援没有任何问题,这有效:

1 / 0 rescue ZeroDivisionError
Run Code Online (Sandbox Code Playgroud)

我也尝试将命令括起来,但是成功了:

(require 'unexisting_script') rescue LoadError
Run Code Online (Sandbox Code Playgroud)

我可以将所有内容放在一行中;:

begin require 'unexisting_script'; rescue LoadError; end
Run Code Online (Sandbox Code Playgroud)

但我仍然在想,为什么最短的版本不起作用.

我发现了一些相关的问题,但没有一个提到需要和救援的问题:

我的问题:

我可以rescue在一线条件下使用require吗?如果是的话:怎么样?如果不是:为什么?

ruby require rescue

3
推荐指数
1
解决办法
4952
查看次数

Ruby:Dir.chdir使用windows中文本文件的数据

我试图使用脚本来使用Dir.chdir更改工作目录

这有效:

dirs = ['//servername/share','//servername2/share']

dirs.each do |dir|
  Dir.chdir dir
end
Run Code Online (Sandbox Code Playgroud)

如果我将上述共享信息放入文本文件(每个新行共享)并尝试加载:

File.foreach("shares.txt") {|dir|
  Dir.chdir dir
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

'chdir':没有这样的文件或目录 - // servername/share(Errno :: ENOENT)

如何从文本文件中读取共享并更改到该目录?有一个更好的方法吗?

ruby windows directory chdir

2
推荐指数
1
解决办法
979
查看次数

SQLite/Sequel:Dataset#max 返回日期和时间戳的字符串

我使用Dataset#max日期和时间戳列 ( DB[:data].max(:timestamp),但我得到一个字符串作为结果,而不是时间戳或日期。

例子:

require 'sequel'
DB = Sequel.sqlite()
#~ DB.use_timestamp_timezones = true #no effect
DB.create_table(:data){
  Fixnum :num
  timestamp :timestamp
  Date :date
} unless DB.table_exists?(:data)

#Insert some testdata
1.upto(10){|i|
  DB[:data].insert(i, Time.now - 24*60*60*i, Date.today - i)
}

#
#my self written max function.
#
def max(ds,field)
    timestamp = nil
    ds.select(field).each{|ds|
      timestamp = ds[field] if ! timestamp or timestamp < ds[field]
    }
    timestamp
end


##Ok
p max(DB[:data],:num)
p DB[:data].max(:num)   #ok

p max(DB[:data],:timestamp)     #timestamp -> ok
p DB[:data].max(:timestamp)     #String!! …
Run Code Online (Sandbox Code Playgroud)

ruby sqlite sequel

2
推荐指数
1
解决办法
866
查看次数

续集:如何获取数据集列的数据类型

如何获取数据集列的数据类型.或者更一般:如何获取数据集的架构?

想象一下我有以下情况:

require 'sequel'
DB = Sequel.sqlite()
DB.create_table(:data){
    nvarchar :key
    timestamp :timestamp
    Date :date
}

sel = DB[:data].select(:key, :timestamp)
Run Code Online (Sandbox Code Playgroud)

现在我想知道,timestamp我选择的列中的数据类型.

我想得到类似的东西Sequel::Dataset#columntype(column).

我做了这样的解决方案:

module Sequel
  class Dataset
    def schema()
      schema = []
      self.db.schema(self).each{|colid, coldef|
        next unless self.columns.include?(colid)
        schema << [colid, coldef]
      }
      schema
    end

    def columntype(colname)
      self.schema.each{|colid, coldef|
        next unless colid == colname
        return coldef[:type]
      }
      raise ArgumentError, "#{colname} not part of #{self.inspect}"
    end
  end
end

p sel.schema #-> [[:key, {:allow_null=>true, :default=>nil, :primary_key=>false,....
p sel.columntype(:timestamp) #-> :datetime …
Run Code Online (Sandbox Code Playgroud)

ruby dataset sequel

2
推荐指数
1
解决办法
2024
查看次数

Axlsx Gem:Ruby - 创建下拉菜单

wb.add_worksheet(name: 'Report') do |sheet|
  sheet.add_data_validation("D25", {
    :type => :list,
    :formula1 => 'list!D11:D17',
    :showDropDown => false,
    :showInputMessage => true,
    :promptTitle => 'blah blah',
    :prompt => 'Please select a valid blah'
    })
end
Run Code Online (Sandbox Code Playgroud)

我不知道如何填充下拉列表。该模板显示了一个插入符号,它告诉我它知道我希望这是一个下拉菜单。

ruby excel axlsx dropdown

2
推荐指数
1
解决办法
1610
查看次数

如何使用续集将表字段与字符串连接起来

我想用Sequel版本替换遗留的sql语句,并且有问题要解决创建一个连接字段.

一个例子:

require 'sequel'
DB = Sequel.sqlite
DB.create_table(:test){
  field :text, :type => :nvarchar, :size => 5
}
DB[:test].insert('aa')
DB[:test].insert('bb')
DB[:test].insert('cc')


sel = DB[:test].select(
  (:text + '1' ).as(:concat)
  )
puts sel.sql
puts sel.all
Run Code Online (Sandbox Code Playgroud)

这很好用,结果是:

SELECT (`text` || '1') AS 'concat' FROM `test`
{:concat=>"aa1"}
{:concat=>"bb1"}
{:concat=>"cc1"}
Run Code Online (Sandbox Code Playgroud)

我的问题:我需要'1aa'.使用SQL这没有问题:

puts DB.fetch("SELECT ('1' || `text`) AS 'concat' FROM `test`").all
Run Code Online (Sandbox Code Playgroud)

但是对于ruby我收到了语法错误(can't convert Symbol into String (TypeError):

sel = DB[:test].select(
  ('1' + :text).as(:concat)
  )
Run Code Online (Sandbox Code Playgroud)

有趣的是,这再次有效:

sel = DB[:test].select(
  (:text + '1' + :text).as(:concat)
  )
puts …
Run Code Online (Sandbox Code Playgroud)

ruby concat concatenation sequel

1
推荐指数
1
解决办法
1317
查看次数

Ruby Float Round错误Bug?

当我尝试对下面的类进行单元测试时,我得到以下舍入错误:

class TypeTotal
    attr_reader  :cr_amount,  :dr_amount,
                 :cr_count,  :dr_count

    def initialize()
        @cr_amount=Float(0);    @dr_amount=Float(0)
        @cr_count=0;            @dr_count= 0
    end

    def increment(is_a_credit, amount, count=1)
        case is_a_credit        
         when true
            @cr_amount = Float(amount)+ Float(@cr_amount)
            @cr_count += count
         when false
            @dr_amount = Float(amount)+ Float(@dr_amount)
            @dr_count += count
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

单元测试:

require_relative 'total_type'
require 'test/unit'

class TestTotalType < Test::Unit::TestCase 
  #rounding error
  def test_increment_count()
    t = TypeTotal.new()
       t.increment(false, 22.22, 2)       
       t.increment(false, 7.31, 3) 
     assert_equal(t.dr_amount, 29.53)    
  end
end
Run Code Online (Sandbox Code Playgroud)

输出:

  1) Failure:
test_increment_count(TestTotalType) [total_type_test.rb:10]:
<29.529999999999998> expected but was …
Run Code Online (Sandbox Code Playgroud)

ruby floating-point unit-testing rounding-error

0
推荐指数
1
解决办法
697
查看次数