Ruby on rails 将嵌套关联呈现为json

Ruby on rails 将嵌套关联呈现为json,ruby-on-rails,ruby-on-rails-5,json-api,Ruby On Rails,Ruby On Rails 5,Json Api,下面是我的模型定义 # GoogleApp model class GoogleApp < ApplicationRecord has_many :gmail_users, foreign_key: 'app_account', primary_key: 'google_account', dependent: :destroy has_many :gmail_threads, foreign_key: 'app_account', primary_key: 'google_acc

下面是我的模型定义

# GoogleApp model
class GoogleApp < ApplicationRecord
  has_many :gmail_users, foreign_key: 'app_account', primary_key: 'google_account', dependent: :destroy
  has_many :gmail_threads, foreign_key: 'app_account', primary_key: 'google_account', dependent: :destroy
end

# GmailUser model
class GmailUser < ApplicationRecord
  belongs_to :google_app, foreign_key: 'app_account', primary_key: 'google_account', optional: true
  has_one :gmail_thread, foreign_key: 'user_id', primary_key: 'user_id', dependent: :destroy
end

# GmailThread model
class GmailThread < ApplicationRecord
  belongs_to :google_app, foreign_key: 'app_account', primary_key: 'google_account', optional: true
  belongs_to :gmail_user, foreign_key: 'user_id', primary_key: 'user_id', optional: true
  has_many :gmail_messages, -> { order "sent_at asc" }, foreign_key: 'thread_id', primary_key: 'thread_id', dependent: :destroy
end

# GmailMessage model
class GmailMessage < ApplicationRecord
  belongs_to :gmail_thread, foreign_key: 'thread_id', primary_key: 'thread_id', optional: true
  has_many :gmail_attachments, foreign_key: 'message_id', primary_key: 'message_id', dependent: :destroy
end

# GmailAttachment model
require "base64"
class GmailAttachment < ApplicationRecord
  belongs_to :gmail_message, foreign_key: 'message_id', primary_key: 'message_id', optional: true

  def encode_as_base64_data
    Base64.encode64(self.base64_data)
  end
end
但是这会在
上产生语法错误,除了
之外,即

语法错误(/home/work/projects/backend/app/controllers/gmail_controller.rb:40:语法错误,意外的tLABEL …e:{gmail_附件:(除了::base64_数据,方法:[:enc。。。 ... ^~~~~~~ ):

我无法解决这个语法错误问题。当我这样做的时候

render status: 200, json: GmailAttachment.first.to_json(except: [:base64_data], methods: [:encode_as_base64_data])

然后它会按预期工作。

exclude
应该用
{}
而不是
()


我建议使用Gem以可维护的方式包含嵌套模型。

谢谢。我注意到,如果我在rails模型中定义了一个与属性名同名的方法,该方法执行的功能与我们在这里使用的相同,除了:[some_属性],方法:[:some_方法]。即,我们通过在模型中使用相同的命名函数劫持属性。请参阅
render status: 200, json: GmailAttachment.first.to_json(except: [:base64_data], methods: [:encode_as_base64_data])
render status: 200, json: @google_app.to_json({include: [gmail_users: {include: [gmail_thread: {include: [gmail_messages: {include: {gmail_attachments: {except: :base64_data, methods: [:encode_as_base64_data]}}]}]}]})