добавить имя пользователя в posts JSON с помощью Ruby on Rails API

#ruby-on-rails #activerecord #delegates #belongs-to

#ruby-on-rails #activerecord #делегаты #принадлежит

Вопрос:

У меня есть модель Posts, которая принадлежит модели User в моем репозитории Rails API. Я добавил столбец в таблицу Posts, который является ‘username’. Я хотел бы добавить current_user.name для каждого поста в столбце имя пользователя.

Могу ли я использовать делегат для добавления пользователя, который создает имя записи, в столбец username в моей таблице Post.

Я уже добавил идентификатор пользователя в качестве ссылки, которая работает.

 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 в разделе: username

Комментарии:

1. Я думаю, что таблица Post не должна содержать username атрибут, а вместо этого запрашивать связанный с ним User экземпляр, какой он username . Почему? Потому что, когда пользователь сообщения меняется на другого, вам нужно будет убедиться, что имя пользователя сообщения изменено соответствующим образом. Есть несколько других причин не добавлять этот столбец имени пользователя в Post и просто оставить его пользователю.

2. Я использую это только как API, и связанный пользователь для сообщения никогда не изменится — это похоже на facebook user / posts модель

Ответ №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

Комментарии:

1. Я использую rails просто как API, поэтому post.user.username не будет работать

2. Я не уверен, что понимаю. Итак, вы получаете данные из API и поэтому не можете получить доступ к данным через ActiveRecord? Или вы создаете API? Возможно, стоит уточнить вопрос.

3. Я использую rails в качестве API, и доступ ко всем данным posts осуществляется через json. Я бы хотел, чтобы имя пользователя, которому принадлежит каждое сообщение, было включено в posts json

4. Это не мешает вам использовать преимущества ActiveRecord в отношении отношений. На самом деле в ядро Rails включена функциональность 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