2014-01-20 5 views
0

У меня есть объект ActiveRecord, который сериализовал свойство hash для одного из моих столбцов базы данных. Я хотел бы уйти от этого, так как запрос одним из хеш-ключей очень сложно/не чист. Поэтому я разделил все ключи хэша на отдельные свойства модели. Тем не менее, у меня много мест, использующих этот код, поэтому пока я конвертирую все, что я хотел бы иметь свойство в моем объекте ActiveRecord, предназначенном только для Rails (т. Е. Он не заполняется обратно в мою базу данных), который обертывает эти свойства в хеш, как это было раньше, и позволяют устанавливать и получать значения.Hash getter и setter на объекте ActiveRecord

Так, например, это то, что я имел обыкновение иметь:

class MyCls < ActiveRecord::Base 
    serialize :state, Hash 
    attr_accessible :id, :mode 

Я избавляясь от :state и заменить его на 7 различных значений, составивших этот хэш. Но я все равно хотел бы получить доступ к этим значениям следующим образом: MyObj.state[:obj_num]. Хотя у меня теперь есть obj_num как свойство (т. Е. MyObj.obj_num). Я думаю, что лучший способ сделать это - иметь свойство state с геттером и сеттером, но я не могу, похоже, получить синтаксис правильно. Для сеттера мне нужно будет поддерживать как настройку хэша в целом, так и установку отдельных клавиш.

ответ

1

Прежде всего сказать: я не думаю, что это лучшее решение. Когда вы снова коснетесь этого кода, скажем, через 3 года это будет «WHAAAAAT HAVE I DONE?» ... Это лучшее решение для замены всех фрагментов кода другим кодом.

Вы можете добавить метод method_missing объекта после удаления этой строки serialize :state, чтобы получить все вызовы, которые хотят получить доступ к уже существующему сериализованному полю объекта. Его объясняется здесь:

http://blog.enriquez.me/2010/2/21/dont-forget-about-respond-to-when-implementing-method-missing/

Вызванное метапрограммирование. Thats «магия рельсов», которая делает все работы find_by_attribute_name без определения каждого из этих методов. Может быть классным, но вам нужно быть очень осторожным, и вам нужно знать, что вы делаете.

+0

Спасибо за отзыв. Думаю, я не мог скрыть тот факт, что я новичок в разработке Ruby/Rails :) – Kyle

+0

Я бы этого не догадался. Метапрограммирование не так просто и не очень хорошо известно, хотя огромное количество функций по умолчанию для рельсов основано на таких вещах. – davidb

+0

Я ответил на это подробно здесь: http://stackoverflow.com/a/21286988/1001324 – davidb