我在轨道上使用红宝石的新东西,并且暂时没有问题。我使用的是rails 4.2.3
模型
class User < ActiveRecord::Base
has_one :tag, dependent: :destroy
class Tag < ActiveRecord::Base
belongs_to :user
我使用以下代码来获取用户标记(作为示例)
user = User.find(1)
tags = user.tag
从Tag Model获取的行(标记的哈希)如下所示:
=> #<Tag id: 1, user_id: 1, summer_programs: true, scholarships: false, stem: false, humanities: false, computer_science: false, traveling: false, community_service: false, research: false, internships: true, arts: false, created_at: "2015-08-11 17:15:04", updated_at: "2015-08-13 21:37:35">
我现在想要的是:选择值为true的商品。在这种情况下,它们应该如下:
{summer_programs: true, internships: true}
我写了以下代码:
truetags = tags.select{|key, value| value == true}
但这会让我失误:
NoMethodError: private method `select' called for #<Tag:0x007fcfd6f563d0>
有什么想法?谢谢。
答案 0 :(得分:1)
您收到该错误,因为标记是一个活动记录数组而不是哈希值。试试
truetags = tags.select{|tag| tag.summer_programs && tag.internships}.
我认为你想映射所有记录,只选择真实的字段。您可以使用属性方法。
truetags = tags.flat_map { |tag|tag.attributes.select {|k,v| [k,v] if v==true}}
不确定是否有活跃的记录方式可以做到这一点,但如果您有大量记录,则值得探索。
答案 1 :(得分:0)
如果你想要夏季课程和实习的所有标签都是真的,试试这个。
truetags = Tags.where(summer_programs: true, internships: true)
如果你想为每个用户提供这些标签
truetags = user.tags.where(summer_programs: true, internships: true)
答案 2 :(得分:0)
您可以执行以下操作 - 将其添加到用户
# user.rb
def self.in(*args)
results = joins(:tag)
args.each do |arg|
results = results.where(:tags => {arg => true})
end
return results
end
然后请求用户
User.in(:summer_programs, :internships)
你可以采取这种方法,并用它做更多,错误检查等。