Проблема Ruby on Rails to_json с: include

У меня есть следующий код

@asset = Asset.first(
  :include => [
    :asset_statuses => [
      :asset_status_name, 
      {:asset_location => [
        {:asset_floor => :asset_building}
      ]}
    ],
    :asset_type => [
      :asset_category => :asset_department
    ]
  ],

(возможно, не лучшая таблица DB, но то, что я должен использовать)

Asset.first работает правильно, и он возвращает данные правильно, но когда я пытаюсь использовать один и тот же :include в методе to_json, он терпит неудачу с следующей ошибкой:

@asset.to_json( 
  :include => [
    :asset_statuses => [
      :asset_status_name,
      {:asset_location => [
        {:asset_floor => :asset_building}
      ]}
    ],
    :asset_type => [
      :asset_category => :asset_department]
    ] 
)

NoMethodError (undefined method `macro' for nil:NilClass):

Метод to_json имеет тот же синтаксис :include, что и find; Я не понимаю, почему он не работает.

Ответ 1

В случае, если кто-то другой сталкивается с проблемой, связанной с причудливой проблемой, которую я сделал... to_json также вернет эту ошибку, когда вы попытаетесь включить ассоциацию, которая не определена в модели.

Ответ 2

Я думаю, что синтаксис to_json: include немного отличается.

Я обычно делаю

@asset.to_json(:include => { :asset_statuses => {
                             :include => :asset_status_name}})

(и начните с маленького, а затем добавьте все другие вещи. раздражающая схема!)

Ответ 3

Я получил эту ошибку при попытке смешать отношения 1-го и 2-го порядка в одном вызове to_json. Вот что я изначально имел:

render :json => @reports.to_json(:include => 
   [:report_type, :organisation, :analysis => {:include => :upload}]

который выдает метод undefined `macro 'для исключения nil: NilClass выше.

Вот как я его исправил:

render :json => @reports.to_json(:include => 
   {:report_type => {}, :organisation => {}, 
    :analysis => {:include => {:upload => {}}}})

Массив будет работать для отношений одного порядка, но для отношений второго порядка содержащий объект должен быть хешем.

Ответ 4

У меня была эта проблема, когда я переопределил функцию as_json

def as_json(options={})
  if options[:admin] 
    super(:methods => [:url_thumb] )
  else
    super(options.merge( :only => :id ))
  end
end

по какой-то причине, когда вы вызываете as_json или to_json в массиве без аргументов, параметры стали nil.

Исправление:

def as_json(options={})
  options = {} if options.nil?
  if options[:admin] 
    super(:methods => [:url_thumb] )
  else
    super(options.merge( :only => :id ))
  end
end