2016-07-21 3 views
1

Я одна таблица называется postsНайти запись с хэш-значением в рельсах

create_table "posts", force: :cascade do |t| 
    t.text  "values" 
end 

Мои записи значения

#<Post id: 1, values: {"p1"=>"1", "p2"=>"xyz"}> 
#<Post id: 2, values: {"p1"=>"1", "p2"=>"abc"}> 

Я хочу, чтобы найти запись с поста, где values[:p2] = "abc"

+0

Почему вы храните значения хэша в своей БД? Почему бы не создать два столбца, один для 'p1' и один для' p2'. Затем вы можете запросить его с помощью 'posts.where (p2: 'abc')'. – nicholas79171

+0

Wait .. какой? Значения JSON сохраняются как текст? это действительно уродливо и непригодно. эти p1, p2 .. должны быть общими? и почему бы вам не использовать 't.json'? – siegy22

+0

Рельсы также имеют тип данных для хранения значений хэша: hstore, вы можете использовать его как t.hstore. – Navin

ответ

1

Чтобы ответить на ваш вопрос, ваш лучший выбор - использовать LIKE query для получения столбцов, содержащих вашу подстроку:

Posts.where("values like %\"p2\"=>\"abc\"%") 

Вышеприведенный запрос не был протестирован, но должен содержать строки, содержащие "p2"=>"abc".

Но, как я упоминал в комментариях, I не рекомендовать это решение. Настройка таблицы, как это было бы намного лучше:

create_table "posts", force: :cascade do |t| 
    t.text  "p1" 
    t.text  "p2" 
end 

Тогда ваш новый запрос становится

Posts.where(p2: 'abc') 

, который не только намного чище, это будет гораздо быстрее.

+0

Я попробовал первый запрос, но он не работал – ashvin

+0

У вас была ошибка? Или просто ничего нет? И почему вы хотите, чтобы ваша база данных настроена таким образом? – nicholas79171

Смежные вопросы