Files
fizzy/app/models/filter.rb
T
Ítalo Matos fbc586646f Refactor: improve query scope composition with merge syntax (#2131)
* Refactor: improve query scope composition with merge syntax

Replace manual WHERE clause concatenation with Rails' merge method
for more elegant and maintainable scope composition across Card,
Comment, and Filter models. This approach better follows Rails
conventions and improves code readability.

* Extend scope composition improvements to Card::Closeable

Apply the same nested hash syntax pattern to closures table references
in order and where clauses.

* Remove unnecessary outer braces from where clause

---------

Co-authored-by: Jeremy Daer <jeremy@37signals.com>
2025-12-13 10:10:13 -08:00

76 lines
2.1 KiB
Ruby

class Filter < ApplicationRecord
include Fields, Params, Resources, Summarized
belongs_to :creator, class_name: "User", default: -> { Current.user }
belongs_to :account, default: -> { creator.account }
class << self
def from_params(params)
find_by_params(params) || build(params)
end
def remember(attrs)
create!(attrs)
rescue ActiveRecord::RecordNotUnique
find_by_params(attrs).tap(&:touch)
end
end
def cards
@cards ||= begin
result = creator.accessible_cards.preloaded.published
result = result.indexed_by(indexed_by)
result = result.sorted_by(sorted_by)
result = result.where(id: card_ids) if card_ids.present?
result = result.where.missing(:not_now) unless include_not_now_cards?
result = result.open unless include_closed_cards?
result = result.unassigned if assignment_status.unassigned?
result = result.assigned_to(assignees.ids) if assignees.present?
result = result.where(creator_id: creators.ids) if creators.present?
result = result.where(board: boards.ids) if boards.present?
result = result.tagged_with(tags.ids) if tags.present?
result = result.where(cards: { created_at: creation_window }) if creation_window
result = result.closed_at_window(closure_window) if closure_window
result = result.closed_by(closers) if closers.present?
result = terms.reduce(result) do |result, term|
result.mentioning(term, user: creator)
end
result.distinct
end
end
def empty?
self.class.normalize_params(as_params).blank?
end
def single_board
boards.first if boards.one?
end
def single_workflow
boards.first.workflow if boards.pluck(:workflow_id).uniq.one?
end
def cacheable?
boards.exists?
end
def cache_key
ActiveSupport::Cache.expand_cache_key params_digest, "filter"
end
def only_closed?
indexed_by.closed? || closure_window || closers.present?
end
private
def include_closed_cards?
only_closed? || card_ids.present?
end
def include_not_now_cards?
indexed_by.not_now? || card_ids.present?
end
end