2020-09-25 21:02:34 +00:00
|
|
|
# == Schema Information
|
|
|
|
#
|
2022-05-16 08:29:59 +00:00
|
|
|
# Table name: articles
|
2020-09-25 21:02:34 +00:00
|
|
|
#
|
2022-06-13 10:26:49 +00:00
|
|
|
# id :bigint not null, primary key
|
|
|
|
# content :text
|
|
|
|
# description :text
|
|
|
|
# status :integer
|
|
|
|
# title :string
|
|
|
|
# views :integer
|
|
|
|
# created_at :datetime not null
|
|
|
|
# updated_at :datetime not null
|
|
|
|
# account_id :integer not null
|
|
|
|
# author_id :bigint
|
|
|
|
# category_id :integer
|
|
|
|
# folder_id :integer
|
|
|
|
# portal_id :integer not null
|
|
|
|
#
|
|
|
|
# Indexes
|
|
|
|
#
|
|
|
|
# index_articles_on_author_id (author_id)
|
|
|
|
#
|
|
|
|
# Foreign Keys
|
|
|
|
#
|
|
|
|
# fk_rails_... (author_id => users.id)
|
2020-09-25 21:02:34 +00:00
|
|
|
#
|
2022-05-16 08:29:59 +00:00
|
|
|
class Article < ApplicationRecord
|
2022-06-13 10:26:49 +00:00
|
|
|
include PgSearch::Model
|
|
|
|
|
2020-09-25 21:02:34 +00:00
|
|
|
belongs_to :account
|
|
|
|
belongs_to :category
|
|
|
|
belongs_to :portal
|
|
|
|
belongs_to :author, class_name: 'User'
|
|
|
|
|
|
|
|
before_validation :ensure_account_id
|
|
|
|
validates :account_id, presence: true
|
|
|
|
validates :category_id, presence: true
|
|
|
|
validates :author_id, presence: true
|
|
|
|
validates :title, presence: true
|
|
|
|
validates :content, presence: true
|
|
|
|
|
|
|
|
enum status: { draft: 0, published: 1 }
|
|
|
|
|
2022-06-13 10:26:49 +00:00
|
|
|
scope :search_by_category_slug, ->(category_slug) { where(categories: { slug: category_slug }) if category_slug.present? }
|
|
|
|
scope :search_by_category_locale, ->(locale) { where(categories: { locale: locale }) if locale.present? }
|
|
|
|
|
|
|
|
# TODO: if text search slows down https://www.postgresql.org/docs/current/textsearch-features.html#TEXTSEARCH-UPDATE-TRIGGERS
|
|
|
|
pg_search_scope(
|
|
|
|
:text_search,
|
|
|
|
against: %i[
|
|
|
|
title
|
|
|
|
description
|
|
|
|
content
|
|
|
|
],
|
|
|
|
using: {
|
|
|
|
tsearch: {
|
|
|
|
prefix: true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
def self.search(params)
|
|
|
|
records = joins(
|
|
|
|
:category
|
|
|
|
).search_by_category_slug(params[:category_slug]).search_by_category_locale(params[:locale])
|
|
|
|
records.text_search(params[:query]) if params[:query].present?
|
|
|
|
records.page(current_page(params))
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.current_page(params)
|
|
|
|
params[:page] || 1
|
|
|
|
end
|
|
|
|
|
2020-09-25 21:02:34 +00:00
|
|
|
private
|
|
|
|
|
|
|
|
def ensure_account_id
|
|
|
|
self.account_id = portal&.account_id
|
|
|
|
end
|
|
|
|
end
|