How to chain class methods together in Ruby on Rails?
I've got this in my Rails 5 model:
def self.payable
open.where.not(:delivery_status => "draft")
end
def self.draft
where(:delivery_status => "draft")
end
def self.open
where(:payment_status => "open")
end
Is there a more elegant way to write the first method?
It would be great to chain the open
and draft
methods together like this:
def self.payable
open.not(:draft)
end
Unfortunately, this doesn't work.
ruby-on-rails ruby
add a comment |
I've got this in my Rails 5 model:
def self.payable
open.where.not(:delivery_status => "draft")
end
def self.draft
where(:delivery_status => "draft")
end
def self.open
where(:payment_status => "open")
end
Is there a more elegant way to write the first method?
It would be great to chain the open
and draft
methods together like this:
def self.payable
open.not(:draft)
end
Unfortunately, this doesn't work.
ruby-on-rails ruby
1
may be of help
– potashin
Nov 26 '18 at 13:36
add a comment |
I've got this in my Rails 5 model:
def self.payable
open.where.not(:delivery_status => "draft")
end
def self.draft
where(:delivery_status => "draft")
end
def self.open
where(:payment_status => "open")
end
Is there a more elegant way to write the first method?
It would be great to chain the open
and draft
methods together like this:
def self.payable
open.not(:draft)
end
Unfortunately, this doesn't work.
ruby-on-rails ruby
I've got this in my Rails 5 model:
def self.payable
open.where.not(:delivery_status => "draft")
end
def self.draft
where(:delivery_status => "draft")
end
def self.open
where(:payment_status => "open")
end
Is there a more elegant way to write the first method?
It would be great to chain the open
and draft
methods together like this:
def self.payable
open.not(:draft)
end
Unfortunately, this doesn't work.
ruby-on-rails ruby
ruby-on-rails ruby
asked Nov 26 '18 at 13:17
Tintin81Tintin81
4,1731251115
4,1731251115
1
may be of help
– potashin
Nov 26 '18 at 13:36
add a comment |
1
may be of help
– potashin
Nov 26 '18 at 13:36
1
1
may be of help
– potashin
Nov 26 '18 at 13:36
may be of help
– potashin
Nov 26 '18 at 13:36
add a comment |
2 Answers
2
active
oldest
votes
To chain negated queries you can use this trick:
def self.payable
open.where.not(id: draft)
end
Another alternative if you don't care if an ActiveRecord::Relation
object is returned is using -
, which returns an Array
:
def self.payable
open - draft
end
I would personally use scope
s instead of class methods for queries: https://guides.rubyonrails.org/active_record_querying.html#scopes. So:
scope :draft, -> { where(:delivery_status => "draft") }
scope :open, -> { where(:payment_status => "open") }
scope :payable, -> { open.where.not(id: draft) }
1
"This is exactly the same as defining a class method, and which you use is a matter of personal preference". From the documentation you linked
– Ursus
Nov 26 '18 at 14:17
add a comment |
Maybe you can use scopes?
scope :payable, -> { open.where.not(:delivery_status => "draft") }
You can use this like that
YouModel.payable
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53481988%2fhow-to-chain-class-methods-together-in-ruby-on-rails%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
To chain negated queries you can use this trick:
def self.payable
open.where.not(id: draft)
end
Another alternative if you don't care if an ActiveRecord::Relation
object is returned is using -
, which returns an Array
:
def self.payable
open - draft
end
I would personally use scope
s instead of class methods for queries: https://guides.rubyonrails.org/active_record_querying.html#scopes. So:
scope :draft, -> { where(:delivery_status => "draft") }
scope :open, -> { where(:payment_status => "open") }
scope :payable, -> { open.where.not(id: draft) }
1
"This is exactly the same as defining a class method, and which you use is a matter of personal preference". From the documentation you linked
– Ursus
Nov 26 '18 at 14:17
add a comment |
To chain negated queries you can use this trick:
def self.payable
open.where.not(id: draft)
end
Another alternative if you don't care if an ActiveRecord::Relation
object is returned is using -
, which returns an Array
:
def self.payable
open - draft
end
I would personally use scope
s instead of class methods for queries: https://guides.rubyonrails.org/active_record_querying.html#scopes. So:
scope :draft, -> { where(:delivery_status => "draft") }
scope :open, -> { where(:payment_status => "open") }
scope :payable, -> { open.where.not(id: draft) }
1
"This is exactly the same as defining a class method, and which you use is a matter of personal preference". From the documentation you linked
– Ursus
Nov 26 '18 at 14:17
add a comment |
To chain negated queries you can use this trick:
def self.payable
open.where.not(id: draft)
end
Another alternative if you don't care if an ActiveRecord::Relation
object is returned is using -
, which returns an Array
:
def self.payable
open - draft
end
I would personally use scope
s instead of class methods for queries: https://guides.rubyonrails.org/active_record_querying.html#scopes. So:
scope :draft, -> { where(:delivery_status => "draft") }
scope :open, -> { where(:payment_status => "open") }
scope :payable, -> { open.where.not(id: draft) }
To chain negated queries you can use this trick:
def self.payable
open.where.not(id: draft)
end
Another alternative if you don't care if an ActiveRecord::Relation
object is returned is using -
, which returns an Array
:
def self.payable
open - draft
end
I would personally use scope
s instead of class methods for queries: https://guides.rubyonrails.org/active_record_querying.html#scopes. So:
scope :draft, -> { where(:delivery_status => "draft") }
scope :open, -> { where(:payment_status => "open") }
scope :payable, -> { open.where.not(id: draft) }
edited Nov 27 '18 at 5:20
sawa
131k29205302
131k29205302
answered Nov 26 '18 at 14:02
Ana María Martínez GómezAna María Martínez Gómez
1,400721
1,400721
1
"This is exactly the same as defining a class method, and which you use is a matter of personal preference". From the documentation you linked
– Ursus
Nov 26 '18 at 14:17
add a comment |
1
"This is exactly the same as defining a class method, and which you use is a matter of personal preference". From the documentation you linked
– Ursus
Nov 26 '18 at 14:17
1
1
"This is exactly the same as defining a class method, and which you use is a matter of personal preference". From the documentation you linked
– Ursus
Nov 26 '18 at 14:17
"This is exactly the same as defining a class method, and which you use is a matter of personal preference". From the documentation you linked
– Ursus
Nov 26 '18 at 14:17
add a comment |
Maybe you can use scopes?
scope :payable, -> { open.where.not(:delivery_status => "draft") }
You can use this like that
YouModel.payable
add a comment |
Maybe you can use scopes?
scope :payable, -> { open.where.not(:delivery_status => "draft") }
You can use this like that
YouModel.payable
add a comment |
Maybe you can use scopes?
scope :payable, -> { open.where.not(:delivery_status => "draft") }
You can use this like that
YouModel.payable
Maybe you can use scopes?
scope :payable, -> { open.where.not(:delivery_status => "draft") }
You can use this like that
YouModel.payable
answered Nov 26 '18 at 13:34
KosBloKosBlo
192
192
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53481988%2fhow-to-chain-class-methods-together-in-ruby-on-rails%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
may be of help
– potashin
Nov 26 '18 at 13:36