Anda di halaman 1dari 52

ARel and Rails 2

Building fast queries

Friday, 4 June 2010


Friday, 4 June 2010
Rails 3

Friday, 4 June 2010


Rails 3
Coming Soon (tm)

Friday, 4 June 2010


Rails 3
Coming Soon (tm)
Maybe RailsConf?

Friday, 4 June 2010


Rails 3.1

Friday, 4 June 2010


Friday, 4 June 2010
Ruby on Rails

Friday, 4 June 2010


Rails Conf

Friday, 4 June 2010


?
Friday, 4 June 2010
Rails Conf

Friday, 4 June 2010


Friday, 4 June 2010
Friday, 4 June 2010
ARel and Rails 2

Friday, 4 June 2010


User.find_by_sql(
<insanely complex SQL goes here>
)

Friday, 4 June 2010


ARel

Friday, 4 June 2010


Arel::Table.engine =
Arel::Sql::Engine.new(ActiveRecord::Base)

Friday, 4 June 2010


Table(:users)

Rails 2

Friday, 4 June 2010


User

Rails 3

Friday, 4 June 2010


where take

join order skip

project to_sql

Friday, 4 June 2010


where take

join order skip

project to_sql

Friday, 4 June 2010


where
eq
not_eq
lt
lteq
gt
gteq
in
not_in
matches
not_matches
Friday, 4 June 2010
*_any *_all

Friday, 4 June 2010


users = Table(:users)

Friday, 4 June 2010


any

users.where(users[:first_name].eq_any
(Ryan, Bob, Alice, Etc.))

Friday, 4 June 2010


eq

users.where(users[:first_name].eq(Ryan))

Friday, 4 June 2010


old skool

User.find_all_by_first_name(Ryan)

Friday, 4 June 2010


Friday, 4 June 2010
chainable

ryans = users.where(users[:first_name].eq(Ryan))
ryans.where(users[:programmer].eq(true))

Friday, 4 June 2010


in

users.where(emails[:sent_at].in((2.weeks.ago)..(1.week.ago))

Friday, 4 June 2010


where take

join order skip

project to_sql

Friday, 4 June 2010


join
lteq

users.join(emails).on(emails[:user_id].eq(users[:id]).
where(emails[:sent_at].lteq(2.weeks.ago))

Friday, 4 June 2010


super join

users.join(donations).on(donations[:user_id].eq(users[:id])).
join(invites).on(invites[:id].eq(donations[:invite_id])).
join(pushes).on(pushes[:id].eq(invites[:push_id])).
join(campaigns).on(campaigns[:id].eq(pushes[:campaign_id])).
where(campaigns[:id].eq(parameters[:campaign_id]))

Friday, 4 June 2010


users.join(donations).on(donations[:user_id].eq(users[:id])).
join(invites).on(invites[:id].eq(donations[:invite_id])).
join(pushes).on(pushes[:id].eq(invites[:push_id])).
where(campaigns[:id].eq(parameters[:campaign_id])).
join(campaigns).on(campaigns[:id].eq(pushes[:campaign_id]))

Friday, 4 June 2010


Friday, 4 June 2010
where take

join order skip

project to_sql

Friday, 4 June 2010


SELECT users.id, users.username, users.email, users.first_name, users.last_name,
users.title, users.company, users.alt_email, users.phone, users.mobile, users.aim,
users.yahoo, users.google, users.skype, users.password_hash, users.password_salt,
users.persistence_token, users.perishable_token, users.last_request_at, users.last_login_at,
users.current_login_at, users.last_login_ip, users.current_login_ip, users.login_count,
users.deleted_at, users.created_at, users.updated_at, users.admin, users.suspended_at,
users.failed_login_count, users.facebook_email, users.facebook_uid, users.facebook_session_key,
users.oauth_token, users.oauth_secret, users.twitter_uid, users.twitter_login,
users.twitter_name, users.avatar_url, users.address, users.suburb, users.country,
users.facebook_enabled_at, users.twitter_enabled_at, users.email_confirmed_at,
users.postcode_id, users.state, users.gender, users.born_on, users.marital_status,
users.industry_id, users.ethnicity_id, users.has_children, users.has_grandchildren,
users.has_nesb, donations.id, donations.user_id, donations.amount_in_cents,
donations.frequency, donations.payment_method, donations.cc_expiry_month,
donations.cc_expiry_year, donations.created_at, donations.updated_at, donations.active,
donations.last_donated_at, donations.cc_last_four_digits, donations.cc_name_on_card,
donations.client_id, donations.invite_id, invites.id, invites.push_id, invites.name,
invites.description, invites.launch_date, invites.status, invites.medium, invites.ask,
invites.page_series, invites.pause_at_number, invites.number_sent, invites.opens,
invites.clicks, invites.actions_taken, invites.revenue, invites.deleted_at,
invites.created_at, invites.updated_at, invites.generation_id, invites.spam_reports,
invites.bounces, invites.requests, invites.list_id, pushes.id, pushes.name,
pushes.status, pushes.start_date, pushes.end_date, pushes.objective, pushes.target,
pushes.budget, pushes.donations_target, pushes.members_target, pushes.opens_target,
pushes.clicks_target, pushes.actions_target, pushes.created_at, pushes.updated_at,
pushes.campaign_id, pushes.deleted_at, campaigns.id, campaigns.user_id,
campaigns.assigned_to, campaigns.name, campaigns.access, campaigns.status, campaigns.budget,
campaigns.revenue, campaigns.start_date, campaigns.end_date, campaigns.objective,
campaigns.deleted_at, campaigns.created_at, campaigns.updated_at, campaigns.outcome,
campaigns.target FROM users INNER JOIN donations ON donations.user_id = users.id INNER
JOIN invites ON invites.id = donations.invite_id INNER JOIN pushes ON pushes.id =
invites.push_id INNER JOIN campaigns ON campaigns.id = pushes.campaign_id WHERE
campaigns.id IS NULL

Friday, 4 June 2010


SELECT users.* FROM users INNER JOIN
donations ON donations.user_id =
users.id INNER JOIN invites ON
invites.id = donations.invite_id INNER
JOIN pushes ON pushes.id =
invites.push_id INNER JOIN campaigns ON
campaigns.id = pushes.campaign_id WHERE
campaigns.id IS NULL

Friday, 4 June 2010


project

.project(users.*)

Friday, 4 June 2010


where take

join order skip

project to_sql

Friday, 4 June 2010


order

users.order(users[:first_name])
users.order(users[:first_name].desc)

Friday, 4 June 2010


where take

join order skip

project to_sql

Friday, 4 June 2010


take

users.take(5)

Friday, 4 June 2010


where take

join order skip

project to_sql

Friday, 4 June 2010


skip

users.skip(10).take(5)

Friday, 4 June 2010


where take

join order skip

project to_sql

Friday, 4 June 2010


users.take(5).project(*).to_sql

"SELECT * FROM \"users\" LIMIT 5"

Friday, 4 June 2010


Finding?

User.find_by_sql(users.to_sql)

Friday, 4 June 2010


Real world usage

temporary_users = connection.select_values(sql)

temporary_users.uniq.flatten.map! do |user_ids|
[self.id, user_ids].join(",")
end.join("\n")

query = "COPY lists_users(list_id, user_id) FROM STDIN WITH CSV"


raw_connection.exec(query)
raw_connection.put_copy_data(temporary_users)
raw_connection.put_copy_end

Friday, 4 June 2010


Custom SQL

users.order(RANDOM())

users.where(foo = bar)

Friday, 4 June 2010


Friday, 4 June 2010
Done.

Friday, 4 June 2010

Anda mungkin juga menyukai