Как включить ассоциацию модели в ответ JSON в Rails? - PullRequest
0 голосов
/ 21 декабря 2010

Я просмотрел похожие посты, но, похоже, не совсем понял.

У меня есть следующая функция, которая прекрасно работает. Модель Listing имеет внешний ключ с именем price_id , который сопоставляется с моделью Price и столбцом price_range . Price_id возвращается как часть объекта message в ответе JSON.

Как можно вернуть соответствующее значение price_range из ассоциации вместо значения price_id (как часть сообщения obj, и сохранить другие атрибуты )

def update
    @listing = Listing.find(params[:listing][:id])

    #if params were passed in for updating
    if @listing.update_attributes(params[:listing])
    #should we return the whole thing or just what's needed?
        json_response = {
             "success" => @listing.save, #save to DB and assign true/false based on success...
             "message" => @listing.attributes #USE attributes to show output the content of the @message obj, and not another object called "message"
        }

        respond_to do |format| 
            #json response
            format.html { render:json => json_response } 
            format.xml { render :xml => @listing } 

            #normal response. Consider leaving this for now?
            #format.html { render :action => "detail" } #refresh this page, with new data in it. Consider trying to use redirect instead?
            #format.xml  { head :ok }
        end
    end #end if 

end

Ответы [ 3 ]

3 голосов
/ 21 декабря 2010

добавьте метод в модель листинга с помощью price_range и вызовите его в serializable_hash

class Listing

  def price_range
    price.price_range
  end
end

Как и в случае объяснения в комментарии, вы можете использовать делегат вместо этого метода:

class Listing
  delegate :prince_range, :to => price
end

В васконтроллер теперь можно сделать:

   json_response = {
         "success" => @listing.save, #save to DB and assign true/false based on success...
         "message" => @listing.serializable_hash(:methods => [:price_range])
    }
2 голосов
/ 21 декабря 2010

Исходя из того, что я прочитал в этой статье , вы должны быть в состоянии сделать это:

class Listing
  def as_json
    super(:include => :price)
  end
end

Затем в вашем контроллере:

json_response = {
  "success" => @listing.save,
  "message" => @listing.as_json
}
0 голосов
/ 21 декабря 2010

Если я правильно понимаю, вы хотите добавить значение @listing.price.price_range к «сообщению»?Если это так, попробуйте это:

"message" => @listing.attributes[:price_range] = @listing.price.price_range
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...