【问题标题】:How to retrieve instance attribute names for which the value is true?如何检索值为真的实例属性名称?
【发布时间】:2012-12-22 23:29:23
【问题描述】:

我正在使用 Ruby on Rails 3.2.9 和 Ruby 1.9.3。我有一个符号数组和一个模型类(ActiveModel),将这些符号(更多其他)作为布尔属性。给定一个类实例,我想检索其值为true 的所有属性名称。那就是:

# Given an array of symbols
[:attr_1, :attr_2, :attr_3]

# Given a class instance
<#Model attr_1: true, attr_2: false, attr_3: false, attr_4: true, ... attr_N: true>

# Then I would like to return
[:attr_1, :attr_4, ..., :attr_N]

我该怎么做?

【问题讨论】:

  • 所有属性都返回布尔值?
  • @tokland - 并非所有与给定模型类相关的属性都返回布尔值,但给定数组中存在的属性“映射”到给定类的属性返回布尔值。

标签: ruby-on-rails ruby ruby-on-rails-3 attributes data-retrieval


【解决方案1】:
attrs = [:attr_1, :attr_2, :attr_3]

class Model
  def are_true?(attr_names)
    eval(attr_names.map {|a| "send(:#{a})"}.join(" && "))
  end
  def which_true?(attr_names)
    attr_names.map {|a| a if send(a) == true}.compact
  end
end

m = <#Model attr_1: true, attr_2: false, attr_3: false, attr_4: true, ... attr_N: true>

m.are_true?(attrs)  # evals if all given attr_names are true
m.which_true?(attrs) # returns array of attr_names which are true

【讨论】:

    【解决方案2】:

    如果您有符号列表,您可以遍历它们并选择正确的符号

    symbols = [:attr_1, :attr_2, :attr_3]
    symbols.select {|sym| object.send(sym) == true }
    

    如果你没有想要的符号列表,你可以简单地遍历模型的所有属性

    symbols = object.attributes
    symbols.select {|sym| object.send(sym) == true }
    

    【讨论】:

    • 您可以放心删除== true
    • 不是真的,那会返回任何不是nilfalse 的东西,问题明确地说:“我想检索其值为true 的所有属性名称"
    • 确实如此,但看看这个例子,我们可以假设所有值都是布尔值(可能是 ActiveModel 的something? 方法)。如果不是,那就是一个糟糕的例子。
    • 同意,但这不是我们应该在没有进一步了解数据模型的情况下做出的假设,而且由于问题只要求 true 值,我相信包含它确实有意义。
    • @tokland - 模型类是ActiveModel
    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多