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
    yesterday






  • 1




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










  • @iGian that was super simple! Thanks.
    – tambakoo
    yesterday










  • sample is not an active record query, though.
    – Sergio Tulentsev
    yesterday






  • 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
    yesterday

















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
    yesterday






  • 1




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










  • @iGian that was super simple! Thanks.
    – tambakoo
    yesterday










  • sample is not an active record query, though.
    – Sergio Tulentsev
    yesterday






  • 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
    yesterday















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 yesterday









tambakoo

5510




5510












  • @iGian couple of hundred times. Less than a thousand.
    – tambakoo
    yesterday






  • 1




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










  • @iGian that was super simple! Thanks.
    – tambakoo
    yesterday










  • sample is not an active record query, though.
    – Sergio Tulentsev
    yesterday






  • 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
    yesterday




















  • @iGian couple of hundred times. Less than a thousand.
    – tambakoo
    yesterday






  • 1




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










  • @iGian that was super simple! Thanks.
    – tambakoo
    yesterday










  • sample is not an active record query, though.
    – Sergio Tulentsev
    yesterday






  • 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
    yesterday


















@iGian couple of hundred times. Less than a thousand.
– tambakoo
yesterday




@iGian couple of hundred times. Less than a thousand.
– tambakoo
yesterday




1




1




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




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












@iGian that was super simple! Thanks.
– tambakoo
yesterday




@iGian that was super simple! Thanks.
– tambakoo
yesterday












sample is not an active record query, though.
– Sergio Tulentsev
yesterday




sample is not an active record query, though.
– Sergio Tulentsev
yesterday




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
yesterday






@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
yesterday














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
    yesterday










  • @SebastianPalma: terrible performance for larger tables.
    – Sergio Tulentsev
    yesterday










  • 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
    yesterday











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
    yesterday










  • @SebastianPalma: terrible performance for larger tables.
    – Sergio Tulentsev
    yesterday










  • 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
    yesterday















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
    yesterday










  • @SebastianPalma: terrible performance for larger tables.
    – Sergio Tulentsev
    yesterday










  • 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
    yesterday













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 yesterday









iGian

2,4442620




2,4442620












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










  • @SebastianPalma: terrible performance for larger tables.
    – Sergio Tulentsev
    yesterday










  • 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
    yesterday


















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










  • @SebastianPalma: terrible performance for larger tables.
    – Sergio Tulentsev
    yesterday










  • 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
    yesterday
















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




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












@SebastianPalma: terrible performance for larger tables.
– Sergio Tulentsev
yesterday




@SebastianPalma: terrible performance for larger tables.
– Sergio Tulentsev
yesterday












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
yesterday




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
yesterday


















 

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

Saint-Aignan (Tarn-et-Garonne)

Volksrepublik China

How to test boost logger output in unit testing?