【发布时间】:2020-07-12 03:30:24
【问题描述】:
我在 Rails 中构建了一个一次性的 Web 应用程序来测试一些新概念。在此过程中,我创建了属于模型的方法,以保持控制器轻巧简单的原则。
但是,现在我正在测试同一个应用程序,但通过 Rails API。我还能在模型中保留这些方法吗?
- 我不确定如何路由 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
谢谢!
【问题讨论】:
标签: ruby-on-rails