【问题标题】:add user 'name' to posts JSON with Ruby on Rails API使用 Ruby on Rails API 将用户“名称”添加到帖子 JSON
【发布时间】:2023-03-10 20:16:01
【问题描述】:

我有一个 Posts 模型,它属于我的 Rails API 存储库中的 User 模型。 我在 Posts 表中添加了一个列,即“用户名”。 我想将 current_user.name 添加到用户名列中的每个帖子。

我可以使用委托将创建帖子名称的用户添加到我的帖子表的用户名列中吗?

我已经添加了 user_id 作为参考。

class Post < ActiveRecord::Base
  belongs_to :user

  def as_json(options={})
    super(only: [:description, :created_at, :user_id, :username])
  end
end

这仅用作 API 并且每次我访问 Post show 路由时,我都希望 JSON 返回帖子所属的用户名,该用户名在 JSON 下:用户名

【问题讨论】:

  • 我认为 Post 表不应该包含 username 属性,而是询问其关联的 User 实例它的 username 是什么。为什么?因为当帖子的用户更改为另一个用户时,您必须确保相应地更改帖子的用户名。不将此用户名列添加到 Post 并将其留给用户还有其他几个原因。
  • 我仅将其用作 API,并且帖子的关联用户永远不会改变 - 它类似于 facebook 用户/帖子模型

标签: ruby-on-rails activerecord delegates belongs-to


【解决方案1】:

将关系数据库与 ActiveRecord 一起使用的想法是,您不必处理诸如“复制”用户名之类的事情。

如果您的数据库架构表明每个帖子都属于一个用户,那么您可以通过以下方式调用帖子的用户:

post.user.username

您试图从中获取用户的帖子必须是。

可以在这里找到一些可以帮助您进一步理解这一点的好例子:http://guides.rubyonrails.org/association_basics.html

要了解如何构建和构建 Rails API,您可以从本指南开始:https://www.codementor.io/ruby-on-rails/tutorial/creating-simple-api-with-rails

【讨论】:

  • 我只是将 rails 用作 api,所以 post.user.username 不起作用
  • 我不确定我是否理解。所以您从 API 获取数据,因此无法通过 ActiveRecord 访问数据?或者你正在构建一个 API?也许考虑澄清这个问题。
  • 我使用 rails 作为 api,所有的帖子数据都是通过 json 访问的。我希望每个帖子所属的用户名都包含在帖子json中
  • 这不会阻止您使用 ActiveRecord 的关系优势。事实上,Rails Core 中包含 API 功能:github.com/rails-api/rails-api
【解决方案2】:

您可以使用ActiveModelSerializers 而不是覆盖as_json。 看这篇文章:https://robots.thoughtbot.com/better-serialization-less-as-json

gem 'active_model_serializers', '~> 0.10.0'
bundle install
rails g serializer post
rails g serializer user

添加要公开的属性/关系。

class PostSerializer < ActiveModel::Serializer
  has_one :user
end

class UserSerializer < ActiveModel::Serializer
  attributes :username, :user_id
end

【讨论】:

    【解决方案3】:

    我只是更改了 Post JSON 的格式以包含用户关联:

      def as_json(options={})
        super(only: [:id, :description, :created_at, :user_id],
        include: [user: { only: [:name] }]
          )
      end
    

    【讨论】:

      猜你喜欢
      • 2012-06-19
      • 2014-08-19
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 2015-04-09
      • 2012-04-30
      相关资源
      最近更新 更多