Class: LinkedRails::Collection
- Inherits:
-
Object
- Object
- LinkedRails::Collection
- Includes:
- ActiveModel::Model, Configuration, Filterable, Iri, IriMapping, Sortable, Model::Actionable, Model::Iri
- Defined in:
- app/models/linked_rails/collection.rb,
app/models/linked_rails/collection/iri.rb,
app/models/linked_rails/collection/view.rb,
app/models/linked_rails/collection/filter.rb,
app/models/linked_rails/collection/sorting.rb,
app/models/linked_rails/collection/infinite.rb,
app/models/linked_rails/collection/sortable.rb,
app/models/linked_rails/collection/paginated.rb,
app/models/linked_rails/collection/filterable.rb,
app/models/linked_rails/collection/iri_mapping.rb,
app/models/linked_rails/collection/filter_field.rb,
app/models/linked_rails/collection/configuration.rb,
app/models/linked_rails/collection/filter_option.rb,
app/models/linked_rails/collection/infinite_view.rb,
app/policies/linked_rails/collection/view_policy.rb,
app/models/linked_rails/collection/paginated_view.rb,
app/serializers/linked_rails/collection/view_serializer.rb,
app/serializers/linked_rails/collection/filter_serializer.rb,
app/serializers/linked_rails/collection/sorting_serializer.rb,
app/serializers/linked_rails/collection/filter_field_serializer.rb,
app/serializers/linked_rails/collection/filter_option_serializer.rb
Overview
rubocop:disable Metrics/ClassLength
Defined Under Namespace
Modules: Configuration, Filterable, Infinite, Iri, IriMapping, Paginated, Sortable Classes: Filter, FilterField, FilterFieldSerializer, FilterOption, FilterOptionSerializer, FilterSerializer, InfiniteView, PaginatedView, Sorting, SortingSerializer, View, ViewPolicy, ViewSerializer
Constant Summary
Constants included from Iri
Iri::DEFAULT_IRI_TEMPLATE_KEYS
Instance Attribute Summary collapse
-
#association_base ⇒ Object
writeonly
Sets the attribute association_base.
-
#name ⇒ Object
Returns the value of attribute name.
-
#policy ⇒ Object
Returns the value of attribute policy.
-
#user_context ⇒ Object
Returns the value of attribute user_context.
-
#view ⇒ Object
Returns the value of attribute view.
- #views ⇒ Object
Attributes included from Sortable
Attributes included from Filterable
#filter, #unfiltered_collection
Instance Method Summary collapse
- #action_list(user_context) ⇒ Object
- #actions(user_context = nil) ⇒ Object
- #apply_scope(association) ⇒ Object
-
#as_json(options = {}) ⇒ Object
prevents a ‘stack level too deep`.
-
#build_child ⇒ Object
rubocop:disable Metrics/AbcSize.
- #columns ⇒ Object
- #default_view ⇒ Object
- #first ⇒ Object
-
#initialize(**opts) ⇒ Collection
constructor
A new instance of Collection.
- #inspect ⇒ Object
- #last ⇒ Object
- #new_child(options) ⇒ Object
- #preview_includes ⇒ Object
- #total_count ⇒ Object
- #total_page_count ⇒ Object
- #unscoped_association ⇒ Object
- #view_with_opts(opts) ⇒ Object
Methods included from Sortable
#default_before_value, #parsed_sort_values, #primary_key_sorting, #sorted?, #sorted_association, #sortings
Methods included from Iri
Methods included from Filterable
#filter_fields, #filtered?, #filters, #unfiltered
Methods included from Model::Iri
#anonymous_iri, #anonymous_iri?, #iri, #iri_elements, #iri_opts, #rdf_type, #reload, #root_relative_iri, #route_fragment
Methods included from Model::Actionable
#action, #action_triples, #collection_actions, #favorite_actions
Constructor Details
#initialize(**opts) ⇒ Collection
Returns a new instance of Collection.
34 35 36 37 38 39 40 41 42 43 |
# File 'app/models/linked_rails/collection.rb', line 34 def initialize(**opts) opts = opts.with_indifferent_access %i[association_class iri_template].each do |key| raise("No #{key} given") if opts[key].blank? end opts[:route_key] ||= opts[:association_class].collection_route_key super end |
Instance Attribute Details
#association_base=(value) ⇒ Object (writeonly)
Sets the attribute association_base
30 31 32 |
# File 'app/models/linked_rails/collection.rb', line 30 def association_base=(value) @association_base = value end |
#name ⇒ Object
Returns the value of attribute name.
29 30 31 |
# File 'app/models/linked_rails/collection.rb', line 29 def name @name end |
#policy ⇒ Object
Returns the value of attribute policy.
29 30 31 |
# File 'app/models/linked_rails/collection.rb', line 29 def policy @policy end |
#user_context ⇒ Object
Returns the value of attribute user_context.
29 30 31 |
# File 'app/models/linked_rails/collection.rb', line 29 def user_context @user_context end |
#view ⇒ Object
Returns the value of attribute view.
29 30 31 |
# File 'app/models/linked_rails/collection.rb', line 29 def view @view end |
#views ⇒ Object
136 137 138 |
# File 'app/models/linked_rails/collection.rb', line 136 def views @views || [default_view] end |
Instance Method Details
#action_list(user_context) ⇒ Object
45 46 47 48 49 50 51 |
# File 'app/models/linked_rails/collection.rb', line 45 def action_list(user_context) @action_list ||= {} @action_list[user_context] ||= association_class.try(:action_list)&.new( resource: self, user_context: user_context ) end |
#actions(user_context = nil) ⇒ Object
53 54 55 56 57 |
# File 'app/models/linked_rails/collection.rb', line 53 def actions(user_context = nil) return [] if action_list(user_context).nil? super end |
#apply_scope(association) ⇒ Object
59 60 61 62 63 |
# File 'app/models/linked_rails/collection.rb', line 59 def apply_scope(association) return association if policy_scope == false policy_scope.new(user_context, association).resolve end |
#as_json(options = {}) ⇒ Object
prevents a ‘stack level too deep`
66 67 68 |
# File 'app/models/linked_rails/collection.rb', line 66 def as_json( = {}) super(.merge(except: %w[association_class unfiltered_collection collection])) end |
#build_child ⇒ Object
rubocop:disable Metrics/AbcSize
70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'app/models/linked_rails/collection.rb', line 70 def build_child # rubocop:disable Metrics/AbcSize child = parent&.build_child(association_class, user_context: user_context) || association_class.build_new(parent: parent, user_context: user_context) parser = LinkedRails::ParamsParser.new(user_context: user_context, params: {filter: @filter}) permitted_child_keys = Pundit.policy(user_context, child)&.permitted_attributes || [] permitted_attributes_from_filters = parser.attributes_from_filters(association_class).permit(permitted_child_keys) child.assign_attributes(permitted_attributes_from_filters) child end |
#columns ⇒ Object
83 84 85 86 87 |
# File 'app/models/linked_rails/collection.rb', line 83 def columns columns_list = association_class.try(:defined_columns).try(:[], table_type) RDF::List[*columns_list] if columns_list.present? end |
#default_view ⇒ Object
89 90 91 |
# File 'app/models/linked_rails/collection.rb', line 89 def default_view @default_view ||= view_with_opts(default_view_opts) end |
#first ⇒ Object
93 94 95 96 97 98 99 100 |
# File 'app/models/linked_rails/collection.rb', line 93 def first case type when :paginated iri_with_root(root_relative_iri(page: 1)) when :infinite iri_with_root(root_relative_iri(before: default_before_value)) end end |
#inspect ⇒ Object
102 103 104 |
# File 'app/models/linked_rails/collection.rb', line 102 def inspect "#<#{association_class}Collection iri:#{iri}>" end |
#last ⇒ Object
106 107 108 |
# File 'app/models/linked_rails/collection.rb', line 106 def last iri_with_root(root_relative_iri(page: [total_page_count, 1].max)) if type == :paginated && total_page_count end |
#new_child(options) ⇒ Object
110 111 112 113 |
# File 'app/models/linked_rails/collection.rb', line 110 def new_child() attrs = .merge(new_child_values) self.class.new(**attrs) end |
#preview_includes ⇒ Object
115 116 117 118 119 120 121 122 |
# File 'app/models/linked_rails/collection.rb', line 115 def preview_includes { default_view: default_view.preview_includes, filter_fields: :options, filters: [], sortings: [] } end |
#total_count ⇒ Object
124 125 126 |
# File 'app/models/linked_rails/collection.rb', line 124 def total_count @total_count ||= association_base.try(:total_count) || unscoped_association.count end |
#total_page_count ⇒ Object
128 129 130 |
# File 'app/models/linked_rails/collection.rb', line 128 def total_page_count (total_count / page_size.to_f).ceil if total_count end |
#unscoped_association ⇒ Object
132 133 134 |
# File 'app/models/linked_rails/collection.rb', line 132 def unscoped_association association_base.respond_to?(:unscope) ? association_base.unscope(:select) : association_base end |
#view_with_opts(opts) ⇒ Object
140 141 142 143 144 145 |
# File 'app/models/linked_rails/collection.rb', line 140 def view_with_opts(opts) @views ||= [] view = collection_view_class.new(**{collection: self, type: type}.merge(opts)) @views << view view end |