0

我剛剛學會了如何通過tag a record查詢該標籤,但我不確定它是否適用於這種情況。我想在我的模型上有一列包含任意鍵的散列(即它們可能與每個記錄不同),然後我希望能夠通過這些鍵/值進行查詢。Rails通過嵌套鍵/值查詢

因此,像這樣:

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

如果使用postgres和hstore列數據類型http://nandovieira.com/using-postgresql-and-hstore-with-rails。你引用的鏈接是使用連接表標記,爲什麼要使用散列?連接表有很多好處。 – Swards

+0

您可以使用Rails的內置'serialize'方法,但在這些序列化的值上創建SQL條件將非常困難。如果您使用的是PostgreSQL,請參閱HStore,如@Swards所述。如果不使用PostgreSQL,我建議你使用另一個表(類似'PetTrait',持有'pet_id','trait_name'和'trait_value')。那麼在SQL – MrYoshiji

回答

0

您可以查詢到根據您想要的值(:http://www.justinweiss.com/articles/should-you-use-scopes-or-class-methods/類方法對這項工作爲好,但這裏有對的時候喜歡一個VS其他的一些想法)上Pet定義範圍。

一些例子:

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')。那是你的追求?

+0

中的條件將會容易得多,謝謝!看起來每個範圍都必須在課堂上定義,但是,對嗎?如果有意義的話,我正在尋找的是一種過濾任意值的方法。所以如果3個'Pet'記錄包含'[:traits] [:has_black_spots] = true'我希望能夠過濾掉這3條記錄。不是所有的'Pet'記錄都會有'has_black_spots',所以我不想爲它創建一個特定的範圍。合理? –