|
|
|
> Based on administrate `0.11.0`
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
```ruby
|
|
|
|
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`:
|
|
|
|
```ruby
|
|
|
|
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. |
|
|
|
\ No newline at end of file |