Rails:如何使用select方法获取一行模型中具有特定值的项目

时间:2015-08-19 19:22:07

标签: ruby-on-rails ruby-on-rails-4

我在轨道上使用红宝石的新东西,并且暂时没有问题。我使用的是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>

有什么想法?谢谢。

3 个答案:

答案 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)

你可以采取这种方法,并用它做更多,错误检查等。