仅在ruby-on-rails中查询非空模型属性

时间:2014-03-26 05:07:44

标签: ruby-on-rails ruby activerecord model

我正在为具有匹配属性的用户进行活动记录查询,该属性具有传递到suggestions(character)方法的字符参数。我希望like-attributes得到匹配,如果一个字符的属性留空,那么它会与任何用户匹配。

我如何只查询字符。*(character.age,character.height等)非null的属性?

例如,如果我的一个字符只有一个名称和年龄,而其他属性留空,因此为null,如何在调用User.where()时不查询它们?用户可以使用哪种其他方法?旁注:有更多属性,因此将每个案例分成不同的方法是没有意义的。

  def suggestions(character)
    suggestions = User.where(
      age: character.age,
      height: character.height,
      weight: character.weight,
      gender: character.gender,
      ethnicity: character.ethnicity
    )
  end

2 个答案:

答案 0 :(得分:1)

您可以非常简单地过滤字符对象以忽略nil值,然后触发查询。

def suggestions character
  filter_character = {}
  character.serializable_hash.map {|key, value| filter_character[key] = value unless value.nil?}
  suggestions = User.where **filter_character
end

这样做是序列化原始对象,过滤掉nil值,然后将其作为splat传递回查询。

这是一种完全可扩展的方法,可以使用对象上的任意数量的属性。

答案 1 :(得分:1)

您需要从对象中删除空参数,然后执行搜索:

def suggestions(character)
     character_params = character.attributes.dup
     search  = character_params.delete_if{|k,v| v.nil?}
     suggestions = User.where(search)       
end