Переопределение To_Json в Ruby - PullRequest
2 голосов
/ 24 декабря 2009

У меня в Ruby есть объект Post. Я хотел бы преобразовать сообщение в json, но также хочу включить имя пользователя, который опубликовал сообщение. Дело в том, что user_name отсутствует в объекте Post, но идентификатор пользователя есть.

Так что я действительно хочу что-то вроде этого

{name:"My Post", body:"My post data", user_name:"jhonny"}

Когда я делаю to_json для объекта Post, я получаю следующее

{name:"My Post", body:"My post data"}

Но я также хочу добавить user_name:"jhonny" часть также к нему. Я знаю, что могу сделать это хешем, а затем сделать to_json для хеша, но я не хочу делать хеш для всех значений публикации вручную, так как существует много атрибутов для публикации. Я бы предпочел использовать функцию слияния хешей, чтобы добавить дополнительный атрибут к хешу, а затем вызвать для него json.

Есть ли способ сделать объект быстрого хеша для класса ruby? Любые идеи будут приветствоваться.

Что-то вроде

my_post.hash.merge{:user_name => "jhonny"}.to_json

Приветствие.

Ответы [ 2 ]

4 голосов
/ 24 декабря 2009

Ответ на ваш вопрос должен выглядеть примерно так

my_post.attributes.merge{:user_name => "jhonny"}.to_json

В любом случае, если это не сработало, просто попробуйте одно из следующих решений:

Добавьте это к вашей Post модели:

def to_json
  ActiveRecord::JSON.decode(super).merge({:user_name => user.user_name}).to_json
end

Другим решением будет добавление метода user_name к модели Post:

def user_name
  user.user_name
end

Затем используйте to_json следующим образом:

my_post.to_json(:methods => :username)
0 голосов
/ 24 декабря 2009

Если ваша модель Post является моделью ActiveRecord, она принимает: кроме:: include и: только параметры для методов сериализации, включая #to_json. Подробности и примеры смотрите здесь, в документации AR .

В основном вам понадобится что-то вроде

my_post.to_json(:include => { :user => { :only => :user_name } })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...