Skip to content
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

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

brunohkbx
Copy link
Contributor

@brunohkbx brunohkbx commented Feb 6, 2020

Description

As we discussed on #868, it makes sense to move this module into CollectionDecorator since it depends upon decorator_class and context.

References


# Configures the strategy used to proxy the query methods, which defaults to `:active_record`.
def strategy
@strategy ||= LoadStrategy.new(Draper.default_query_methods_strategy)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does the name LoadStrategy still make sense in this new context? Should it be something like QueryMethodStrategy or something more specific to query methods? I don't have a big opinion here, but it does seem odd.

@n-rodriguez
Copy link
Contributor

@brunohkbx can you please rebase your branch on master ? Thank you !

Copy link
Collaborator

@Alexander-Senko Alexander-Senko left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Decorated collection may be not backed by a DB. These strategies make no sense in that case (see #920).

@@ -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
Copy link
Collaborator

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?

Copy link
Collaborator

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).

@@ -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
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
return super unless strategy.allowed? method
return super unless object.respond_to? method

def method_missing(method, *args, &block)
return super unless strategy.allowed? method

object.send(method, *args, &block).decorate(with: decorator_class, context: context)
Copy link
Collaborator

Choose a reason for hiding this comment

The 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)
object.send(method, *args, &block).try(:decorate, with: decorator_class, context: context)

@Alexander-Senko Alexander-Senko added this to the 5.0 milestone Aug 31, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants