blob: a208293248171dc498d724de93c40e75d4c9a553 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
class Creation
include Queryable
scope :tagged, ->(tag) { tagged_with([tag]).where('photos_count > 0') }
scope :published, ->{ joins(:photos).where(photos: { image_processing: nil }) }
scope :search, ->(query) { where(["UPPER(creations.name) LIKE :query OR UPPER(creations.story) LIKE :query", { query: "%#{query.upcase}%" }]) }
scope :sorted_by, ->(direction) do
order(created_at: "oldest" == direction ? :asc : :desc)
end
class Repository < SimpleDelegator
def initialize(connection = Creation)
@connection = connection
super(connection)
end
def tagged(tag)
connection.includes([:user, :photos]).tagged(tag)
end
def search(query)
connection.includes(:user, :photos).search(query)
end
def search_with(params)
filter_by(search_filters_for(params))
end
private
attr_reader :connection
def search_filters_for(params)
query_builder_for(params) do |builder|
builder.always do |relation|
relation.published
end
builder.if_present(:category) do |relation, category|
relation.where(category: Category.by_slug(category))
end
builder.if_present(:q) do |relation, query|
relation.search(query)
end
builder.if_present(:tags) do |relation, tags|
relation.tagged(tags.downcase.parameterize)
end
builder.if_present(:sort) do |relation, sort_order|
relation.sorted_by(sort_order)
end
builder.if_missing(:sort) do |relation, sort_order|
relation.sorted_by("newest")
end
end
end
end
end
|