Я создал одноразовое веб-приложение на рельсах, чтобы проверить некоторые новые концепции. При этом я создал методы, которые принадлежали модели, чтобы сохранить принцип легкости и простоты контроллеров.
Однако сейчас я тестирую то же приложение, но через API-интерфейс rails. Могу ли я сохранить эти методы в модели?
- Я не уверен, как маршрутизировать API для доступа к этим методам.
- Потому что он включает вложенную модель (контакты через пользователей ), Я даже не знаю, с чего начать ставить в контроллер. Могу ли я сделать контроллер для вложенной модели?
Вот модель пользователя, которая дает представление о том, о чем я говорю. Большинство методов необходимы для процесса добавления / приема и создания контактов.
class User < ApplicationRecord
has_many :contactships, dependent: :destroy
has_many :contacts, -> { where contactships: { status: :accepted }}, through: :contactships
has_many :requested_contacts, -> { where contactships: { status: :requested }}, through: :contactships, source: :contact
has_many :pending_contacts, -> { where contactships: { status: :pending }}, through: :contactships, source: :contact
has_many :blocked_contacts, -> { where contactships: { status: :blocked }}, through: :contactships, source: :contact
has_many :contactships_inverse, class_name: 'Contactship', foreign_key: :contact_id
has_many :contacts_inverse, through: :contactships_inverse, source: :user
has_one_attached :avatar
validates_presence_of :first_name, :last_name
def full_name
"#{first_name} #{last_name}"
end
def all_contacts
contacts + contacts_inverse
end
def has_contactship?(contact)
#return true if the user is a contact
return true if self == contact
contactships.map(&:contact_id).include?(contact.id)
end
def requested_contacts_with?(contact)
return false if self == contact
#we are going to map requested contacts with list of users to see if they include contact_id
requested_contacts.map(&:id).include?(contact.id)
end
def pending_contacts_with?(contact)
return false if self == contact
pending_contacts.map(&:id).include?(contact.id)
end
def contacts_with?(contact)
return false if self == contact
contacts.map(&:id).include?(contact.id)
end
def contact_request(contact)
#unless the contact is not equal to self and contactship does not already exist
unless self == contact || Contactship.where(user: self, contact: contact).exists?
#transaction means that if one fails they both are rolled back
transaction do
#for user to another user (sent request)
Contactship.create(user: self, contact: contact, status: :pending)
#from another user to user (recieve request)
Contactship.create(user: contact, contact: self, status: :requested)
end
end
end
def accept_request(contact)
transaction do
Contactship.find_by(user: self, contact: contact, status: [:requested])&.accepted!
Contactship.find_by(user: contact, contact: self, status: [:pending])&.accepted!
end
end
def reject_request(contact)
transaction do
Contactship.find_by(user: self, contact: contact)&.destroy!
Contactship.find_by(user: contact, contact: self)&.destroy!
end
end
end
Спасибо!