-
Notifications
You must be signed in to change notification settings - Fork 526
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
refactor: move module query-methods into collection-decorator #874
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -2,7 +2,6 @@ module Draper | |||||
class CollectionDecorator | ||||||
include Enumerable | ||||||
include Draper::ViewHelpers | ||||||
include Draper::QueryMethods | ||||||
extend Draper::Delegation | ||||||
|
||||||
# @return the collection being decorated. | ||||||
|
@@ -72,6 +71,17 @@ def replace(other) | |||||
self | ||||||
end | ||||||
|
||||||
# Proxies missing query methods to the source class if the strategy allows. | ||||||
def method_missing(method, *args, &block) | ||||||
return super unless strategy.allowed? method | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
|
||||||
object.send(method, *args, &block).decorate(with: decorator_class, context: context) | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
end | ||||||
|
||||||
def respond_to_missing?(method, include_private = false) | ||||||
strategy.allowed?(method) || super | ||||||
end | ||||||
|
||||||
protected | ||||||
|
||||||
# Decorates the given item. | ||||||
|
@@ -88,5 +98,10 @@ def item_decorator | |||||
->(item, options) { item.decorate(options) } | ||||||
end | ||||||
end | ||||||
|
||||||
# Configures the strategy used to proxy the query methods, which defaults to `:active_record`. | ||||||
def strategy | ||||||
@strategy ||= LoadStrategy.new(Draper.default_query_methods_strategy) | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Does the name |
||||||
end | ||||||
end | ||||||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
module Draper | ||
module LoadStrategy | ||
def self.new(name) | ||
const_get(name.to_s.camelize).new | ||
end | ||
|
||
class ActiveRecord | ||
def allowed?(method) | ||
::ActiveRecord::Relation::VALUE_METHODS.include? method | ||
end | ||
end | ||
|
||
class Mongoid | ||
def allowed?(method) | ||
raise NotImplementedError | ||
end | ||
end | ||
end | ||
end |
This file was deleted.
This file was deleted.
This file was deleted.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm new here, so please forgive my stupid question 🙏
Why do we need any strategy in the first place? Isn't
object.respond_to?
enough?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see: it's for methods returning decoratable collections. It's not obvious for everyone, though (see #867).