我正在为具有匹配属性的用户进行活动记录查询,该属性具有传递到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
答案 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