Skip to content

Field: ScopedHasManyField

Derk-Jan Karrenbeld edited this page Mar 15, 2019 · 2 revisions

Based on administrate 0.11.0

Alternatively you can use the gem administrate-field-scoped_has_many.

The BelongsTo field has an option scope, but the HasMany always calls associated_class.all. This is an extension field to provide this functionality to HasMany associations.

require "administrate/field/has_many"

class ScopedHasManyField < Administrate::Field::HasMany
  protected

  def self.field_type
    superclass.field_type
  end

  private

  def candidate_resources
    scope = options[:scope] ? options[:scope].call(self) : associated_class.all
    scope = scope.includes(*options.fetch(:includes)) if options.key?(:includes)

    order = options.delete(:order)
    order ? scope.reorder(order) : scope
  end
end

You can now use this in ATTRIBUTE_TYPES:

class FooDashboard < Administrate::BaseDashboard
ATTRIBUTE_TYPES = {
  bar: ScopedHasManyField.with_options(scope: -> (field) { OtherModel.where(foo: field.resource) }),
}

Now your has_many candidates is limited to the current foo instance.

User Docs

Clone this wiki locally