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
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 thensample
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
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
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 thensample
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
@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 thensample
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
|
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 theid
s out of thecities
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 theid
s 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 theid
s out of thecities
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 theid
s 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 theid
s out of thecities
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 theid
s 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 theid
s out of thecities
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 theid
s 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 theid
s out of thecities
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 theid
s 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 id
s 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 id
s 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 id
s 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 id
s 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
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