2013-07-18 4 views
27

में JSON प्रतिपादन जुड़े मॉडल शामिल करें अभी मैं इस लाइन है:जब रेल

render json: @programs, :except => [:created_at, :updated_at] 

हालांकि, बाद से एक कंपनी belongs_to एक कार्यक्रम मैं कंपनी का आईडी के बजाय कंपनी का नाम प्रदर्शित करना चाहते हैं।

प्रोग्राम प्रस्तुत करते समय मैं कंपनी का नाम कैसे शामिल कर सकता हूं?

+0

हम मॉडल देख सकते हैं? –

+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/7506089/how-to-get-full-belongs-to-object-in-json-render –

उत्तर

43

कुछ इस तरह काम करना चाहिए:

render :json => @programs, :include => {:insurer => {:only => :name}}, :except => [:created_at, :updated_at] 
+2

मुझे अभी भी समझ में नहीं आता है ... कैसे कोई दस्तावेज यह करो? – Meekohi

8

jbuilder का उपयोग कर एक पोषणीय रास्ते में नेस्ट मॉडल शामिल करने के लिए विचार करें:

# /views/shops/index.json.jbuilder 
json.shops @shops do |shop| 

    # shop attributes to json 
    json.id shop.id 
    json.address shop.address 

    # Nested products 
    json.products shop.products do |product| 
    json.name product.name 
    json.price product.price 
    end 

end 
5

तुम भी मॉडल के स्तर पर ऐसा कर सकते हैं।

program.rb

def as_json(options={}) 
    super(:except => [:created_at, :updated_at] 
      :include => { 
      :company => {:only => [:name]} 
      } 
    ) 
    end 
end 
अब

अपने नियंत्रक में:

render json: @programs 
2

इस प्रयास करें। Ref

#`includes` caches all the companies for each program (eager loading) 
programs = Program.includes(:company) 

#`.as_json` creates a hash containing all programs 
#`include` adds a key `company` to each program 
#and sets the value as an array of the program's companies 
#Note: you can exclude certain fields with `only` or `except` 
render json: programs.as_json(include: :company, only: [:name]) 

इसके अलावा, कोई जरूरत @programs एक उदाहरण चर बनाने के लिए, जैसा कि मैंने हम किसी दृश्य पर गुजर नहीं कर रहे हैं यह सोचते हैं रहा हूँ।

8

मैं नियंत्रक विधि से जेसन को प्रतिपादित करते समय "प्रतीक फ़ाइल क्लोन नहीं कर सकता" त्रुटि प्राप्त कर रहा था। इसलिए तरह इसे टाला:

render :json => @list.to_json(:include => [:tasks]) 
0
#includes is used to avoid n+1 query. 
# http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations 
Here is an example for the above example.Lets say you have posts and each post has many comments to it. 

    @posts = Post.where('id IN [1,2,3,4]').includes(:comments) 
    respond_to do |format| 
    format.json {render json: @posts.to_json(:include => [:comments]) } 
    end 

    #output data 
    [ 
    {id:1,name:"post1",comments:{user_id:1,message:"nice"}} 
    {id:2,name:"post2",comments:{user_id:2,message:"okok"}} 
    {id:3,name:"post1",comments:{user_id:12,message:"great"}} 
    {id:4,name:"post1",comments:{user_id:45,message:"good enough"}} 
    ] 
+0

मुझे लगता है कि आप अल्पविराम का उपयोग करना चाहते थे: '@ पोस्ट, इसमें शामिल हैं: टिप्पणियां'। मेरा मानना ​​है कि यदि आप पैरामीटर के साथ फ़ंक्शन के रूप में पदों को निष्पादित करने का प्रयास करते हैं तो आपको एक त्रुटि मिलेगी अर्थात '@ पोस्ट (' – Marklar

+0

धन्यवाद मार्कलर, लेकिन उपरोक्त कोड काम करेगा। – user3716986

+0

मैं देख सकता हूं कि आपने कोड को 'to_json'' शामिल करने के लिए संपादित किया है, इसलिए मुझे लगता है यही कारण है कि यह अब काम करता है और '@ पोस्ट्स का पुराना कोड (: शामिल => [: टिप्पणियां])' काम नहीं किया? – Marklar

संबंधित मुद्दे