我用这些方法上课了:
def promotion_available?
promotion.present?
end
def promotion
@promotion ||= PromotionUser.user(@user.id).available.first
end
然后,一位同事删除了promotion
方法,并以这种方式更改了谓词promotion_available?
:
def promotion_available?
@promotion ||= PromotionUser.user(@user.id).available.first
end
true
/ false
(我认为没有,但我的同事说的相反)?答案 0 :(得分:3)
我可以直接在谓词方法上设置实例变量吗?
是的,它没有任何问题。我经常这样做。
谓词方法可以返回整个对象而不是tre / false(我认为没有,但我的同事说的相反)
是的,这也很常见。但它只有在你使用惯用的红宝石真实性检查时才有效。
if obj.promotion_available? # GOOD
if obj.promotion_available? == true # BAD!
请记住,红宝石中只有nil
和false
是假值。其他一切都是真的。这就是为什么返回一个对象或者nil有点像返回true或false。
答案 1 :(得分:1)
虽然更改“有效”,但它会带来副作用:您必须先调用promotion_available?
才能实际使用promotion
(假设有promotion
方法):
your_object.promotion #=> nil
your_object.promotion_available?
your_object.promotion #=> <#PromotionUser ...>
原始代码没有此依赖关系。
IMO保持promotion
方法并删除promotion_available?
会更直观。你可以写:
if obj.promotion
# with promotion
else
# without promotion
end