我刚学会了tag a record如何通过该标记查询,但我不确定它是否适用于这种情况。我想在我的模型上有一个列,其中包含任意键的散列(即每个记录可能有或可能不同),并且我希望能够通过这些键/值进行查询。
这样的事情:
my_dog = Pet.new
my_dog.traits = {
:weight => 20,
:has_shots => true,
:color => 'brown'
}
their_cat = Pet.new
their_cat.traits = {
:weight => 4,
:has_shots => false,
:color => 'brown'
}
我知道如果我想要做的就是稍后输出,我可以序列化这些数据。但我想在这里实现的是能够通过此哈希中的键查询这些记录。例如(显然错误的查询语法):Pet.where(traits: 'weight < 25 AND color = "brown"')
。
这种事情有可能吗?
答案 0 :(得分:0)
您可以在Pet
上定义范围,以根据您想要的值进行查询(类方法也适用于此,但以下是关于何时优先选择其中一个的问题:http://www.justinweiss.com/articles/should-you-use-scopes-or-class-methods/) 。
一些例子:
scope :max_weight, -> (weight) { where("weight <= ?", weight) }
scope :min_weight, -> (weight) { where("weight >= ?", weight) }
scope :has_color, -> (color) { where("color = ?", color) }
然后,假设您有权访问要过滤的标记变量,则应该可以调用Pet.max_weight(25).has_color('brown')
。这就是你要追求的吗?