Module: SvelteOnRails::ActiveRecordOptIn
- Defined in:
- lib/svelte_on_rails/active_record_extensions.rb
Instance Method Summary collapse
-
#exposes_to_svelte ⇒ Object
Opt this model in to Svelte serialization.
-
#exposes_to_svelte? ⇒ Boolean
Default answer for models that did NOT opt in.
Instance Method Details
#exposes_to_svelte ⇒ Object
Opt this model in to Svelte serialization.
class Article < ApplicationRecord
exposes_to_svelte
end
After this call, instances, the class itself, and relations on this model respond to ‘to_svelte(*attributes, **associations)`.
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
# File 'lib/svelte_on_rails/active_record_extensions.rb', line 84 def exposes_to_svelte return if exposes_to_svelte? # Instance- and class-level methods on the model itself. include SvelteOnRails::ActiveRecordExtensions extend SvelteOnRails::ActiveRecordClassExtensions # Mark this class as opted in (used by `exposes_to_svelte?`). singleton_class.define_method(:exposes_to_svelte?) { true } if abstract_class? # Abstract classes have no relation delegate of their own, so we # cascade to every concrete subclass. We hook `inherited` for # future subclasses, and run the same block for already-loaded # subclasses once, here and now. opt_in_block = lambda do |concrete| next if concrete.abstract_class? [ ActiveRecord::Relation, ActiveRecord::AssociationRelation, ActiveRecord::Associations::CollectionProxy ].each do |base| concrete.relation_delegate_class(base) .include(SvelteOnRails::ActiveRecordRelationExtensions) end end # Pick up subclasses that were already loaded. descendants.each(&opt_in_block) # And catch every future subclass exactly once. define_singleton_method(:inherited) do |subclass| super(subclass) opt_in_block.call(subclass) end else # Concrete model: inject directly into its own relation delegates. [ ActiveRecord::Relation, ActiveRecord::AssociationRelation, ActiveRecord::Associations::CollectionProxy ].each do |base| relation_delegate_class(base) .include(SvelteOnRails::ActiveRecordRelationExtensions) end end end |
#exposes_to_svelte? ⇒ Boolean
Default answer for models that did NOT opt in.
133 134 135 |
# File 'lib/svelte_on_rails/active_record_extensions.rb', line 133 def exposes_to_svelte? false end |