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.
ruby activerecord ruby-on-rails-5
|
show 1 more comment
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.
ruby activerecord ruby-on-rails-5
@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
sampleis 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 thensampleacts 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
|
show 1 more comment
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.
ruby activerecord ruby-on-rails-5
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
ruby activerecord ruby-on-rails-5
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
sampleis 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 thensampleacts 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
|
show 1 more comment
@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
sampleis 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 thensampleacts 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
|
show 1 more comment
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.
Why notCity.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 alsoCity.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 theids out of thecitiestable 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 theids out of the database.
– mu is too short
yesterday
add a comment |
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.
Why notCity.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 alsoCity.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 theids out of thecitiestable 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 theids out of the database.
– mu is too short
yesterday
add a comment |
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.
Why notCity.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 alsoCity.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 theids out of thecitiestable 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 theids out of the database.
– mu is too short
yesterday
add a comment |
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.
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.
answered yesterday
iGian
2,4442620
2,4442620
Why notCity.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 alsoCity.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 theids out of thecitiestable 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 theids out of the database.
– mu is too short
yesterday
add a comment |
Why notCity.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 alsoCity.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 theids out of thecitiestable 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 theids 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
add a comment |
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%2f53371941%2fhow-do-i-run-a-ruby-function-inside-an-activerecord-query%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
@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
sampleis 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
sampleacts 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