我有一个交易表,需要查找日期与今天的日期相符的记录.
在rails控制台中,我需要匹配的日期字段如下所示.我已经分配了一份记录来处理测试.
ruby-1.9.2-p0 > deal.start
=> Tue, 10 May 2011 00:00:00 UTC +00:00
Run Code Online (Sandbox Code Playgroud)
如果我尝试找到与今天的开始日期相匹配的任何记录,那么我就是零
ruby-1.9.2-p0 > Deal.find_by_start(Date.today)
=> nil
Run Code Online (Sandbox Code Playgroud)
然后我认为我可以通过将Date.today转换为日期时间来匹配.
ruby-1.9.2-p0 > Date.today.to_datetime
=> Tue, 10 May 2011 00:00:00 +0000
ruby-1.9.2-p0 > Deal.find_by_start(Date.today.to_datetime)
=> nil
Run Code Online (Sandbox Code Playgroud)
我怎样才能让它发挥作用?我正在使用Rails 3.
编辑:我考虑将它们转换为一致的格式,但是在尝试使用find_by_start方法时不会
ruby-1.9.2-p0 > deal.start.strftime("%a, %e %B %Y") == Date.today.strftime("%a, %e %B %Y")
=> true
ruby-1.9.2-p0 > Deal.find_by_start.strftime("%a, %e %B %Y") == Date.today.strftime("%a, %e %B %Y")
NoMethodError: undefined method `strftime' for nil:NilClass
Run Code Online (Sandbox Code Playgroud) 我有一个像这样的数组:
[["a", nil, nil, nil], ["b", nil, "c", nil], [nil, nil, nil, nil]]
Run Code Online (Sandbox Code Playgroud)
我想从ruby中的数组中删除所有尾随的nil值.
我试过arr.map {|x| x.pop until x.last}但这个方法的问题是,当给定数组中的第3个数组中的数组的所有值都为零时,循环卡住了.
由于until x.last条件,如果所有的值都是nil那么map函数应该返回一个空数组?
应该是什么条件.
输出应该是
[['a'],['b','nil','c'],[]]
Run Code Online (Sandbox Code Playgroud)
请记住,我只想删除nil不在之间的尾随值.
我发现此代码:
sql = <<-SQL.squish
UPDATE #{klass.constantize.table_name}
SET uuid = uuid_generate_v4(), updated_at = now()
WHERE id IN (#{group.map(&:id).join(',')})
AND uuid IS NULL
SQL
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?我认为这是某种特殊的字符串定界符。这叫什么?它是特定于Ruby的吗?在squish做什么
我想cors在我的控制器中使用以下标头呈现JSON :
'Access-Control-Allow-Origin' = '*'.
Run Code Online (Sandbox Code Playgroud)
我试过这个:
def my_action
render(json: some_params)
response.headers['Access-Control-Allow-Origin'] = '*'
end
Run Code Online (Sandbox Code Playgroud)
但我有一个AbstractController::DoubleRenderError.有没有办法用标题呈现JSON?
为什么instance_variables方法不显示@var_one变量a?
a = Object.new
def a.my_eval; yield end
a.my_eval { @var_one = 1 }
a.instance_variables
# => []
instance_variables
# => [@var_one]
Run Code Online (Sandbox Code Playgroud) 在纯Ruby irb中,无法输入{if: 1}.声明不会终止,因为irb认为if不是符号,而是if语句的开头.
那么为什么Rails可以before_filter接受if作为参数呢?该指南的代码如下:
class Order < ApplicationRecord
before_save :normalize_card_number, if: :paid_with_card?
end
Run Code Online (Sandbox Code Playgroud)
同样的事情也发生了unless.
我将RVM用作Ruby的版本管理并安装了Ruby 2.2.5。该捆绑软件已完全成功安装。但是,当我使用rails启动rails服务器时,它给了我“要求”:pg的库版本不兼容(LoadError)。
我尝试过多次重新安装rvm。清洗了宝石镶嵌,但问题仍然存在。
我一次又一次收到以下错误:
.rvm/gems/ruby-2.2.5/gems/pg-0.19.0/lib/pg.rb:4:in `require': incompatible library version - /home/user/.rvm/gems/ruby-2.2.5/gems/pg-0.19.0/lib/pg_ext.so (LoadError)
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激。
我创建了一个Address具有多态关联模型,我想救它,虽然客户端模型嵌套的属性,但我得到Address addressable must exist的@client.errors.
楷模:
class Client < ApplicationRecord
has_one :address, as: :addressable, dependent: :destroy
accepts_nested_attributes_for :address, :allow_destroy => true
end
class Address < ApplicationRecord
belongs_to :addressable, polymorphic: true
end
Run Code Online (Sandbox Code Playgroud)
控制器:
class ClientsController < ApplicationController
def new
@client = Client.new
@client.create_address
end
def create
@client = Client.new(client_params)
if @client.save
...
else
...
end
end
private
def client_params
params.require(:client).permit(:first_name ,:last_name, :company, address_attributes: [:line1, :line2, :line3, :city, :state_province, :postal_code, :country])
end
end
Run Code Online (Sandbox Code Playgroud) 我做了一些基准测试:
require 'benchmark'
words = File.open('/usr/share/dict/words', 'r') do |file|
file.each_line.take(1_000_000).map(&:chomp)
end
Benchmark.bmbm(20) do |x|
GC.start
x.report(:map) do
words.map do |word|
word.size if word.size > 5
end.compact
end
GC.start
x.report(:each_with_object) do
words.each_with_object([]) do |word, long_sizes|
long_sizes << word.size if word.size > 5
end
end
end
Run Code Online (Sandbox Code Playgroud)
输出(ruby 2.3.0):
Rehearsal --------------------------------------------------------
map 0.020000 0.000000 0.020000 ( 0.016906)
each_with_object 0.020000 0.000000 0.020000 ( 0.024695)
----------------------------------------------- total: 0.040000sec
user system total real
map 0.010000 0.000000 0.010000 ( 0.015004)
each_with_object 0.020000 0.000000 0.020000 ( 0.024183)
Run Code Online (Sandbox Code Playgroud)
因为我觉得我无法理解这一点 …
在Tcl中,如果您有一个包含偶数元素的列表,则可以一次循环两个元素.看到这段代码:
foreach { a b } [ list 1 2 3 4 ] {
puts "${a} ${b}"
}
Run Code Online (Sandbox Code Playgroud)
将输出:
1 2
3 4
Run Code Online (Sandbox Code Playgroud)
如何用Ruby获得相同的行为?