gpt4 book ai didi

ruby-on-rails - 安全有效地对可能缺失的属性进行排序?

转载 作者:太空宇宙 更新时间:2023-11-03 16:11:06 25 4
gpt4 key购买 nike

这是我正在做的:

offers = v.offers.sort { |a,b| a.expires <=> b.expires }

此数据是通过 ActiveResource 加载的(因此每组实例属性都由它包含的数据定义)。但是,最近传入数据的更改使“expires”属性成为可选的。如果实例中缺少属性,是否有类定义更改会导致排序方法获取默认值?

编辑:@Nikita

看起来不会那么简单:

o.expires == nil?
NoMethodError: undefined method `expires' for #<Offer:0x00000100d3faa8>

o.expires?
=> nil

所以我尝试了:

offers.sort{|a,b|
if a.expires?
b.expires? ? 0 : -1
else
b.expires? ? 1 : a.expires <=> b.expires
end
}

NoMethodError: undefined method `expires' for #<Offer:0x00000100d3faa8>

我希望能够用类似的东西更新类定义:

expires ||= ""

...但我不知道这是否可能。不过,我还没有真正了解排序 block 的工作原理。我知道我可以循环遍历优惠并分配值(value),但这似乎非常低效。

更新

offers.sort{|a,b|
if defined? a.expires == nil
(defined? b.expires == nil) ? 0 : -1
else
(defined? b.expires == nil) ? 1 : a.expires <=> b.expires
end
}

ArgumentError: comparison of Offer with Offer failed

from (irb):70:in `sort'
from (irb):70
from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.0.0.beta4/lib/rails/commands/console.rb:47:in `start'
from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.0.0.beta4/lib/rails/commands/console.rb:8:in `start'
from /usr/local/lib/ruby/gems/1.9.1/gems/railties-3.0.0.beta4/lib/rails/commands.rb:23:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'

冗长万岁;p

最佳答案

我不明白你想要什么“类定义”。仅仅调整排序 block 不能解决问题吗?

if a.expires == nil
b.expires == nil ? 0 : -1
else
b.expires == nil ? 1 : a.expires <=> b.expires
end

更新中
我懂了。有一个defined? ruby 中的运算符可能会有所帮助。它返回 nil 或表示元素类型的字符串(如“方法”)。

if defined? a.expires == nil
(defined? b.expires == nil) ? 0 : -1
else
(defined? b.expires == nil) ? 1 : a.expires <=> b.expires
end

不过,我还没有真正了解排序 block 的工作原理。
这很容易。它应该返回 -1、0 或 1,这取决于第一个元素是小于、等于还是大于第二个。
<=>运算符或多或少做同样的事情:

1 <=> 2 # result is -1
2 <=> 2 # result is 0
15 <=> 2 # result is 1

再次更新
对我有用

class Offer
def initialize(e)
@expires = e
end

def expires
@expires
end
end
offers = [Offer.new(3), Offer.new(1), Offer.new(2), Object.new]


offers.sort! { |a, b|
if (defined? a.expires) == nil
((defined? b.expires) == nil) ? 0 : -1
else
((defined? b.expires) == nil) ? 1 : a.expires <=> b.expires
end
}
puts offers.inspect

您的错误表明 a.expires类型为 Offer , 这是无法比较的。

冗长万岁;p
欢迎来到 Rails :)

关于ruby-on-rails - 安全有效地对可能缺失的属性进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3445564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com