54

今、私はこの行を持っています:

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

ただし、プログラムは会社に属しているため、会社 ID の代わりに会社名を表示したいと考えています。

プログラムを表示するときに会社名を含めるにはどうすればよいですか?

4

6 に答える 6

20

コントローラーメソッドからのインクルードを使用してjsonをレンダリングしているときに、同じ「シンボルファイルを複製できません」というエラーが発生しました。次のように避けました:

render :json => @list.to_json( :include => [:tasks] )
于 2015-09-03T15:10:34.007 に答える
13

これは、モデル レベルでも実行できます。

program.rb

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

今あなたのコントローラーで:

render json: @programs
于 2015-02-18T03:52:40.723 に答える
9

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  
于 2014-09-04T13:09:12.997 に答える
3

これを試して。参照

#`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インスタンス変数をビューに渡さないと想定しているため、インスタンス変数を作成する必要はありません。

于 2015-06-16T22:51:34.283 に答える