How do I run a ruby function inside an ActiveRecord query?











up vote
0
down vote

favorite












City.all.sample{rand(1..3)} I want the random function to generate the sample count. This always returns one record.










share|improve this question






















  • @iGian couple of hundred times. Less than a thousand.
    – tambakoo
    13 hours ago






  • 1




    [1, 2, 3, 4, 5, 6, 7].sample(rand(1..3))
    – iGian
    13 hours ago










  • @iGian that was super simple! Thanks.
    – tambakoo
    13 hours ago










  • sample is not an active record query, though.
    – Sergio Tulentsev
    13 hours ago






  • 1




    @tambakoo: that it is, but you are not passing your logic to it. It runs unaltered. And then sample acts on the results. And in general, you can't "pass a ruby function to be used in a query". That's the whole point of the databases: to filter/sort/return data with maximum efficiency.
    – Sergio Tulentsev
    13 hours ago

















up vote
0
down vote

favorite












City.all.sample{rand(1..3)} I want the random function to generate the sample count. This always returns one record.










share|improve this question






















  • @iGian couple of hundred times. Less than a thousand.
    – tambakoo
    13 hours ago






  • 1




    [1, 2, 3, 4, 5, 6, 7].sample(rand(1..3))
    – iGian
    13 hours ago










  • @iGian that was super simple! Thanks.
    – tambakoo
    13 hours ago










  • sample is not an active record query, though.
    – Sergio Tulentsev
    13 hours ago






  • 1




    @tambakoo: that it is, but you are not passing your logic to it. It runs unaltered. And then sample acts on the results. And in general, you can't "pass a ruby function to be used in a query". That's the whole point of the databases: to filter/sort/return data with maximum efficiency.
    – Sergio Tulentsev
    13 hours ago















up vote
0
down vote

favorite









up vote
0
down vote

favorite











City.all.sample{rand(1..3)} I want the random function to generate the sample count. This always returns one record.










share|improve this question













City.all.sample{rand(1..3)} I want the random function to generate the sample count. This always returns one record.







ruby activerecord ruby-on-rails-5






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked 14 hours ago









tambakoo

5510




5510












  • @iGian couple of hundred times. Less than a thousand.
    – tambakoo
    13 hours ago






  • 1




    [1, 2, 3, 4, 5, 6, 7].sample(rand(1..3))
    – iGian
    13 hours ago










  • @iGian that was super simple! Thanks.
    – tambakoo
    13 hours ago










  • sample is not an active record query, though.
    – Sergio Tulentsev
    13 hours ago






  • 1




    @tambakoo: that it is, but you are not passing your logic to it. It runs unaltered. And then sample acts on the results. And in general, you can't "pass a ruby function to be used in a query". That's the whole point of the databases: to filter/sort/return data with maximum efficiency.
    – Sergio Tulentsev
    13 hours ago




















  • @iGian couple of hundred times. Less than a thousand.
    – tambakoo
    13 hours ago






  • 1




    [1, 2, 3, 4, 5, 6, 7].sample(rand(1..3))
    – iGian
    13 hours ago










  • @iGian that was super simple! Thanks.
    – tambakoo
    13 hours ago










  • sample is not an active record query, though.
    – Sergio Tulentsev
    13 hours ago






  • 1




    @tambakoo: that it is, but you are not passing your logic to it. It runs unaltered. And then sample acts on the results. And in general, you can't "pass a ruby function to be used in a query". That's the whole point of the databases: to filter/sort/return data with maximum efficiency.
    – Sergio Tulentsev
    13 hours ago


















@iGian couple of hundred times. Less than a thousand.
– tambakoo
13 hours ago




@iGian couple of hundred times. Less than a thousand.
– tambakoo
13 hours ago




1




1




[1, 2, 3, 4, 5, 6, 7].sample(rand(1..3))
– iGian
13 hours ago




[1, 2, 3, 4, 5, 6, 7].sample(rand(1..3))
– iGian
13 hours ago












@iGian that was super simple! Thanks.
– tambakoo
13 hours ago




@iGian that was super simple! Thanks.
– tambakoo
13 hours ago












sample is not an active record query, though.
– Sergio Tulentsev
13 hours ago




sample is not an active record query, though.
– Sergio Tulentsev
13 hours ago




1




1




@tambakoo: that it is, but you are not passing your logic to it. It runs unaltered. And then sample acts on the results. And in general, you can't "pass a ruby function to be used in a query". That's the whole point of the databases: to filter/sort/return data with maximum efficiency.
– Sergio Tulentsev
13 hours ago






@tambakoo: that it is, but you are not passing your logic to it. It runs unaltered. And then sample acts on the results. And in general, you can't "pass a ruby function to be used in a query". That's the whole point of the databases: to filter/sort/return data with maximum efficiency.
– Sergio Tulentsev
13 hours ago














1 Answer
1






active

oldest

votes

















up vote
0
down vote













I'd suggest this way, to avoid retrieving all records:



n.times.map.with_object() { |_, a| a << City.find(City.ids.sample) }


It returns an array of records.



Of course, n can be a random integer.






share|improve this answer





















  • Why not City.order('RAND()').limit(rand(1..3))? (RAND(), RANDOM()) depending the DB.
    – Sebastian Palma
    13 hours ago










  • @SebastianPalma: terrible performance for larger tables.
    – Sergio Tulentsev
    13 hours ago










  • You could also City.find(City.ids.sample(n)) to reduce the number of queries and get a unique set of cities but you'd still be pull all the ids out of the cities table to do the sampling in Ruby and you'd still have an array. City.where(id: City.ids.sample(n)) would give you a relation but, again, you're still pulling all the ids out of the database.
    – mu is too short
    5 hours ago











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',
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
});


}
});














 

draft saved


draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53371941%2fhow-do-i-run-a-ruby-function-inside-an-activerecord-query%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes








up vote
0
down vote













I'd suggest this way, to avoid retrieving all records:



n.times.map.with_object() { |_, a| a << City.find(City.ids.sample) }


It returns an array of records.



Of course, n can be a random integer.






share|improve this answer





















  • Why not City.order('RAND()').limit(rand(1..3))? (RAND(), RANDOM()) depending the DB.
    – Sebastian Palma
    13 hours ago










  • @SebastianPalma: terrible performance for larger tables.
    – Sergio Tulentsev
    13 hours ago










  • You could also City.find(City.ids.sample(n)) to reduce the number of queries and get a unique set of cities but you'd still be pull all the ids out of the cities table to do the sampling in Ruby and you'd still have an array. City.where(id: City.ids.sample(n)) would give you a relation but, again, you're still pulling all the ids out of the database.
    – mu is too short
    5 hours ago















up vote
0
down vote













I'd suggest this way, to avoid retrieving all records:



n.times.map.with_object() { |_, a| a << City.find(City.ids.sample) }


It returns an array of records.



Of course, n can be a random integer.






share|improve this answer





















  • Why not City.order('RAND()').limit(rand(1..3))? (RAND(), RANDOM()) depending the DB.
    – Sebastian Palma
    13 hours ago










  • @SebastianPalma: terrible performance for larger tables.
    – Sergio Tulentsev
    13 hours ago










  • You could also City.find(City.ids.sample(n)) to reduce the number of queries and get a unique set of cities but you'd still be pull all the ids out of the cities table to do the sampling in Ruby and you'd still have an array. City.where(id: City.ids.sample(n)) would give you a relation but, again, you're still pulling all the ids out of the database.
    – mu is too short
    5 hours ago













up vote
0
down vote










up vote
0
down vote









I'd suggest this way, to avoid retrieving all records:



n.times.map.with_object() { |_, a| a << City.find(City.ids.sample) }


It returns an array of records.



Of course, n can be a random integer.






share|improve this answer












I'd suggest this way, to avoid retrieving all records:



n.times.map.with_object() { |_, a| a << City.find(City.ids.sample) }


It returns an array of records.



Of course, n can be a random integer.







share|improve this answer












share|improve this answer



share|improve this answer










answered 13 hours ago









iGian

2,3842620




2,3842620












  • Why not City.order('RAND()').limit(rand(1..3))? (RAND(), RANDOM()) depending the DB.
    – Sebastian Palma
    13 hours ago










  • @SebastianPalma: terrible performance for larger tables.
    – Sergio Tulentsev
    13 hours ago










  • You could also City.find(City.ids.sample(n)) to reduce the number of queries and get a unique set of cities but you'd still be pull all the ids out of the cities table to do the sampling in Ruby and you'd still have an array. City.where(id: City.ids.sample(n)) would give you a relation but, again, you're still pulling all the ids out of the database.
    – mu is too short
    5 hours ago


















  • Why not City.order('RAND()').limit(rand(1..3))? (RAND(), RANDOM()) depending the DB.
    – Sebastian Palma
    13 hours ago










  • @SebastianPalma: terrible performance for larger tables.
    – Sergio Tulentsev
    13 hours ago










  • You could also City.find(City.ids.sample(n)) to reduce the number of queries and get a unique set of cities but you'd still be pull all the ids out of the cities table to do the sampling in Ruby and you'd still have an array. City.where(id: City.ids.sample(n)) would give you a relation but, again, you're still pulling all the ids out of the database.
    – mu is too short
    5 hours ago
















Why not City.order('RAND()').limit(rand(1..3))? (RAND(), RANDOM()) depending the DB.
– Sebastian Palma
13 hours ago




Why not City.order('RAND()').limit(rand(1..3))? (RAND(), RANDOM()) depending the DB.
– Sebastian Palma
13 hours ago












@SebastianPalma: terrible performance for larger tables.
– Sergio Tulentsev
13 hours ago




@SebastianPalma: terrible performance for larger tables.
– Sergio Tulentsev
13 hours ago












You could also City.find(City.ids.sample(n)) to reduce the number of queries and get a unique set of cities but you'd still be pull all the ids out of the cities table to do the sampling in Ruby and you'd still have an array. City.where(id: City.ids.sample(n)) would give you a relation but, again, you're still pulling all the ids out of the database.
– mu is too short
5 hours ago




You could also City.find(City.ids.sample(n)) to reduce the number of queries and get a unique set of cities but you'd still be pull all the ids out of the cities table to do the sampling in Ruby and you'd still have an array. City.where(id: City.ids.sample(n)) would give you a relation but, again, you're still pulling all the ids out of the database.
– mu is too short
5 hours ago


















 

draft saved


draft discarded



















































 


draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53371941%2fhow-do-i-run-a-ruby-function-inside-an-activerecord-query%23new-answer', 'question_page');
}
);

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







Popular posts from this blog

Can a sorcerer learn a 5th-level spell early by creating spell slots using the Font of Magic feature?

Does disintegrating a polymorphed enemy still kill it after the 2018 errata?

A Topological Invariant for $pi_3(U(n))$