Поиск по базам данных сериализованной колонки

0

В приложении MySQL Rails 3 один из моих столбцов сериализуется в Hash. Мой вопрос прост: как я могу получить результаты на основе этого столбца?

Я пробовал этот подход:

example_hash = {id: 666}

ExampleTable.last.hash == example_hash
:true   ###### Here you can see that both hashes are the same

Тем не менее, такой запрос не дает мне никаких результатов и никаких исключений:

ExampleTable.where('hash LIKE ?', example_hash)

Он просто не обнаруживает запись, в которой я нуждаюсь.

  • 0
    почему не ExampleTable.where(example_hash) ?
  • 0
    это дает мне исключение, что нет столбца "id" (ну в этом примере его id)
Показать ещё 1 комментарий

1 ответ

0
my_hash = {id:666}
search_term = my_hash.serializable_hash
ExampleTable.where(search_term)

Я попробовал это в существующем приложении Rails 4. Вам нужно будет проверить, работает ли он в Rails 3. У меня нет include ActiveModel::Serialization в моей модели, и она по-прежнему работает.

Вот моя консольная сессия:

Loading development environment (Rails 4.0.0)
$pry(main)> t = Tool.first
  Tool Load (10.9ms)  SELECT "tools".* FROM "tools" ORDER BY "tools"."id" ASC LIMIT 1
    => #<Tool id: 2, name: "6", serial: "134989652", purchased: nil, put_in_service: nil, cost:     nil, value: nil, in_service: true, retired: nil, created_at: "2013-07-17 06:12:59", updated_at: "2014-02-13 17:19:10", note: "", condition: "5 - Brand New Condition", old_location: "Sta 75", model: "Stihl 066", loaner: false, location_id: 9, category_id: 2, annual_service: false>
$pry(main)> x = t.serializable_hash
=> {"id"=>2,
 "name"=>"6",
 "serial"=>"134989652",
 "purchased"=>nil,
 "put_in_service"=>nil,
 "cost"=>nil,
 "value"=>nil,
 "in_service"=>true,
 "retired"=>nil,
 "created_at"=>Tue, 16 Jul 2013 23:12:59 PDT -07:00,
 "updated_at"=>Thu, 13 Feb 2014 09:19:10 PST -08:00,
 "note"=>"",
 "condition"=>"5 - Brand New Condition",
 "old_location"=>"Sta 75",
 "model"=>"Stihl 066",
 "loaner"=>false,
 "location_id"=>9,
 "category_id"=>2,
 "annual_service"=>false}
$pry(main)> Tool.where(x)
  Tool Load (10.3ms)  SELECT "tools".* FROM "tools" WHERE "tools"."id" = 2 AND "tools"."name" = '6' AND "tools"."serial" = '134989652' AND "tools"."purchased" IS NULL AND "tools"."put_in_service" IS NULL AND "tools"."cost" IS NULL AND "tools"."value" IS NULL AND "tools"."in_service" = 't' AND "tools"."retired" IS NULL AND "tools"."created_at" = '2013-07-17 06:12:59.638381' AND "tools"."updated_at" = '2014-02-13 17:19:10.674233' AND "tools"."note" = '' AND "tools"."condition" = '5 - Brand New Condition' AND "tools"."old_location" = 'Sta 75' AND "tools"."model" = 'Stihl 066' AND "tools"."loaner" = 'f' AND "tools"."location_id" = 9 AND "tools"."category_id" = 2 AND "tools"."annual_service" = 'f'
=> [#<Tool id: 2, name: "6", serial: "134989652", purchased: nil, put_in_service: nil, cost: nil, value: nil, in_service: true, retired: nil, created_at: "2013-07-17 06:12:59", updated_at: "2014-02-13 17:19:10", note: "", condition: "5 - Brand New Condition", old_location: "Sta 75", model: "Stihl 066", loaner: false, location_id: 9, category_id: 2, annual_service: false>]
  • 0
    к сожалению, это не работает, serializable_hash () возвращает ноль, когда я пробую это на {id: 666}, как вы показали
  • 0
    Что, если вы добавите в свою модель include ActiveModel::Serialization ?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню