Rails - 为一个对象和另一个对象的属性渲染 JSON

Rails - Render JSON for one object and another object's attribute

我对 rails 很陌生,就像我一周前刚开始一样。我想知道是否可以渲染 json 一个对象和另一个对象的属性。我实际上不知道我是否在问正确的问题。

无论如何,这是我控制器中目前的代码:

def create
  log_date = LogDate.find_or_initialize_by(date: log_params[:date])

  log_date.save if log_date.new_record?

  log = Log.new(log_params.except(:date))
  log.log_date_id = log_date.id

  if log.save
    render json: log.to_json(include: :log_date), status: :created
end

我测试代码时得到的当前响应是这样的:

{
   "id": 1,
   "log_date_id": 1,
   "hours": 1,
   "ticket_number": "1",
   "description": "sample description",
   "created_at": "2021-08-11T11:41:59.636Z",
   "updated_at": "2021-08-11T11:41:59.636Z",
   "log_date": {
       "id": 1,
       "date": "2021-01-01",
       "max_hours": 8,
       "created_at": "2021-08-11T11:36:20.853Z",
       "updated_at": "2021-08-11T11:41:39.282Z"
   }
}

我想要实现的至少是这样的响应,但我不知道是否可能:

{
   "id": 1,
   "log_date_id": 1,
   "hours": 1,
   "ticket_number": "1",
   "description": "sample description",
   "created_at": "2021-08-11T11:41:59.636Z",
   "updated_at": "2021-08-11T11:41:59.636Z",
   "date": "2021-01-01"
}

最下面的“日期”基本来自log_date。我不介意它位于顶部还是底部,只要响应格式看起来像那样而不是当前的样子。

我真的希望这是可能的,并且有人可以帮助我。无论如何,如果不可能,那就太酷了。提前致谢!

使用 delegation 公开 log_date 上的方法,就好像它是日志实例上的方法一样:

class Log < ApplicationRecord
  belongs_to :log_date
  delegate :date, to: :log_date
end

这基本上只是一个 shorthand 用于:

class Log < ApplicationRecord
  belongs_to :log_date

  def date
    log_date.date
  end
end

您可以在通过 methods 选项呈现 JSON 时包含自定义方法:

render json: log, methods: [:date], status: :created