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
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 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
13 hours ago
|
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 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 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
13 hours ago
|
show 1 more comment
@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 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
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
|
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
13 hours ago
@SebastianPalma: terrible performance for larger tables.
– Sergio Tulentsev
13 hours ago
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
5 hours ago
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
13 hours ago
@SebastianPalma: terrible performance for larger tables.
– Sergio Tulentsev
13 hours ago
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
5 hours ago
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
13 hours ago
@SebastianPalma: terrible performance for larger tables.
– Sergio Tulentsev
13 hours ago
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
5 hours ago
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 13 hours ago
iGian
2,3842620
2,3842620
Why notCity.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 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
5 hours ago
add a comment |
Why notCity.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 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
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 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
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 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
5 hours ago
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
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