Доступ к виртуальному атрибуту из JSON - PullRequest
3 голосов
/ 25 февраля 2011

Моя настройка: Rails 2.3.10, Ruby 1.8.7

Я безуспешно экспериментировал с попыткой получить доступ к виртуальному атрибуту в модели из вызова JSON. Допустим, у меня есть следующие модели и код контроллера

class Product
 name,
 description,
 price,
 attr_accessor :discounted_price 
end

class Price
 discount
end

class ProductsController
 def show
  @product = Product.find(params[:id])
  respond_to do |format|
   format.html # show.html.erb
   format.json { render :json => @product }                                     
  end
 end
end

Мне нравится, что вывод JSON также включает Product.discounts_price, который рассчитывается в режиме реального времени для каждого вызова, т.е. discounts_price = Price.discount * Product.price Есть ли способ сделать это?

РЕШЕНИЕ: С первоначальной помощью dmarkow я понял, что мой реальный сценарий более сложный, чем приведенный выше пример. Я могу сделать что-то вроде этого, в модели продукта добавить метод получения

def discounted_price
 ...# do the calculation here
end

В вызове JSON сделайте это

store = Store.find(1)
store.as_json(:include => :products, :methods => :discounted_price)

Ответы [ 2 ]

25 голосов
/ 25 февраля 2011

Вы можете запустить to_json с параметром :methods, чтобы включить результат этих методов.

render :json => @product.to_json(:methods => :discounted_price)
0 голосов
/ 11 марта 2012

Посмотрите на драгоценный камень RABL, как показано в этом Railscast:

http://railscasts.com/episodes/322-rabl?view=asciicast

RABL дает вам точный контроль над json, который вы производите, включая коллекции и детей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...