Module: Iron::ContentType::FieldQueryable

Defined in:
app/models/iron/content_type/field_queryable.rb

Instance Method Summary collapse

Instance Method Details

#find_by_fields(conditions) ⇒ Object



35
36
37
# File 'app/models/iron/content_type/field_queryable.rb', line 35

def find_by_fields(conditions)
  where_fields(conditions).first
end

#find_by_fields!(conditions) ⇒ Object

Raises:

  • (ActiveRecord::RecordNotFound)


39
40
41
42
43
# File 'app/models/iron/content_type/field_queryable.rb', line 39

def find_by_fields!(conditions)
  record = find_by_fields(conditions)
  raise ActiveRecord::RecordNotFound unless record.present?
  record
end

#order_by_field(field_handle, direction = :asc) ⇒ Object



3
4
5
6
7
8
9
10
# File 'app/models/iron/content_type/field_queryable.rb', line 3

def order_by_field(field_handle, direction = :asc)
  content_type = proxy_association.owner
  definition = content_type.field_definitions.find_by!(handle: field_handle)

  table_alias = "order_field_for_#{field_handle}"
  scope = joins("LEFT OUTER JOIN iron_fields AS #{table_alias} ON #{table_alias}.entry_id = iron_entries.id AND #{table_alias}.definition_id = #{definition.id}")
  scope.order("#{table_alias}.#{definition.value_column}": direction)
end

#pluck_field(field_handle, distinct: false) ⇒ Object



45
46
47
48
49
50
51
52
# File 'app/models/iron/content_type/field_queryable.rb', line 45

def pluck_field(field_handle, distinct: false)
  content_type = proxy_association.owner
  definition = content_type.field_definitions.find_by! handle: field_handle

  scope = definition.fields
  scope = scope.distinct if distinct
  scope.pluck(definition.value_column)
end

#where_fields(conditions) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'app/models/iron/content_type/field_queryable.rb', line 12

def where_fields(conditions)
  content_type = proxy_association.owner
  scope = self
  conditions.each do |handle, condition|
    definition = content_type.field_definitions.find_by! handle: handle
    field_scope = joins(:fields).where(iron_fields: { definition: })
    field_scope = case condition
    when Hash
      apply_field_conditions(field_scope, definition.value_column, condition)
    when Range
      field_scope.where("iron_fields.#{definition.value_column} BETWEEN ? AND ?", condition)
    when Array
      field_scope.where("iron_fields.#{definition.value_column} IN (?)", condition)
    else
      field_scope.where("iron_fields.#{definition.value_column} = ?", condition)
    end

    scope = scope.merge(field_scope)
  end

  scope.distinct
end