#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