Rails’ find_by_sql is the devil. Ninety nine percent of the time find_by_sql is unnecessary and problematic, practitioner but it’s sooo seductive. I can’t even begin to count the ways that find_by_sql can cause trouble, but here’s a few:
- Plugins like acts_as_paranoid rely on developers *not* using the back door to get around the dynamic conditions to exclude deleted rows.
- There quite a few gotchas, ie: “SELECT * FROM users JOIN another_table …” won’t work because ActiveRecord will use the last ID field, not the first.
- Logic “hidden” in find_by_sql is not reusable (as compared to a fancy association, etc)
- It offends my aesthetic sense. We all like to pretend our ORM layer isn’t leaky.. don’t we?
I remember a time when we had to use find_by_sql when we found a feature was missing from ActiveRecord. I propose that the only remaining legitimate use of ActiveRecord may be to call a stored procedure.
So, keeping with the hyperactivity theme, I suggest that we all take some ActiveRitalin: A plugin for Rails that tells ActiveRecord to chill out, and causes developers to sit and think a bit before proceeding.
ActiveRitalin makes find_by_sql private and introduces find_by_sql_with_excuse that warns upon each use. The implementation is very simple:
module ActiveRitalin def self.append_features(klass) super klass.class_eval %( def self.find_by_sql_with_excuse(excuse, sql) RAILS_DEFAULT_LOGGER.warn("Find By Sql called with excuse: " + excuse ) find_by_sql(sql) end class << self private :find_by_sql end ) end end
To use, from your rails application’s root dir:
script/plugin install git://github.com/lukegalea/activeritalin.git
Think you need find_by_sql? Ask yourself the following questions:
- Can I just use :include, :select, :join, :conditions or some combination of the above?
- Should this be an association? (perhaps with :conditions and :select on it? Maybe :readonly?)
520 comments ↓
Ok, I get your point. But… I tend to do a fair amount of statistical correlations and I could load those monster data sets into AR and enumerate through them, but do I really need the AR memory and CPU hit? Not with a quick and speedy find_by_sql to get me the number I want. RDBMS are good for this, so I let them do what they do best.
I’m not talking about your bread-and-butter CRUD ops, but try do to a simple sum across three levels of a join with AR. No can do. So I use a regular find to get the record data I need, and a sprinkle of find_by_sql to get the sums. And it’s fast, too.
I’m sorry, but I need my find_by_sql.
Good call. Definately want the RDBMS to do that stuff.
I know this is going against the Rails mantras, but I usually use a view for that stuff.
Something like:
has_many :house_statistics, :class => ‘House’, :table => ’some_view’, :readonly => true
I really like Luke’s view suggestion. Some DBs also allow indexed views, which could increase your performance even more.
Also, even if you use find_by_sql, I always consider it good practice to leave a comment above the code saying *why* I needed to use it there (e.g. “# PERF: used 30MB of memory just to load 100 records the normal way!!! this takes 300KB.” or “# PERF: took 30sec for 15K records using AR. takes 0.2sec using this”. find_by_sql_with_excuse simply “forces” you to think about it and let others know why you made that decision.
Perhaps, if you wanted to be less opinionated about it, you could alias it to “find_by_sql_with_explanation”. (similar to how svn has “blame”, “annotate”, and “praise”). But I like the opinionated version.
Good conversation, I hope more join in.
I’ll stand against the wind here and say that I’ve never been a big fan of views. Let me explain:
1) I see the value of views if multiple DBAs or inexperienced users are using a database. But what I do rarely has more than one DBA, me.
2) I like to see my select statements right there around the lines I’m working on. That way, three months later, I don’t have to go chasing the CREATE VIEW statements down to recall exactly what they are doing.
3) I put my find_by_sql in the model (where they belong) so that it pretty much like same as creating a view, and I don’t have to create all the views. Indexed views not withstanding.
But, I really like Nicholas’s idea of commenting each find_by_sql statement with specific reasons why it is being used. Bravo!
I have never used views in a rails project. Just out of curiosity, where do you put your CREATE VIEW statements, in the migrations?
I agree, if you are a team of one and you are using a DB without indexed views (or don’t need the performance) then it doesn’t make a big difference.
I’d be worried that some day you won’t be the only one or that later you may find the need to migrate to “better” DB.
It’s only marginally more effort to make a view and then you don’t have to worry about refactoring everything later if you need to scale up the team/technology.
We put our views in the migrations and I believe we fiddled with the schema dumper to have it written out into schema.rb as well.
Karl - perhaps what would meet your use_case is a version of active_ritalin that makes find_by_sql protected, so you can call it from within your models but not from your controller or (GASP!) views.
Luke: even with find_by_sql as private, you can still call it from within the models.
If you wanted to kick active_ritalin up a notch (or down a notch, depending on your POV), you could instead:
* capture the find_by_sql method as an (unbound method) object
* define_method :find_by_sql_with_excuse, using the captured find_by_sql method.
* make both find_by_sql and find_by_sql_with_excuse protected (so it can only be used from within the model class)
* redefine find_by_sql to ‘raise FindBySqlWithoutExplanation’
Then find_by_sql without an excuse is gone for good, and even with an explanation it can only be called from within the model.
What do you think?
Is there code within the rail framework that depends on the existence of find_by_sql and would break if you did this?
I tried something similar (although less complex) originally and found that most of the ActiveRecord::Base methods ultimately called find_by_sql.
So, we need to make sure Base methods can call it. But limiting public access and access from within the descendants of ActiveRecord::Base is what we’re after.
It’s too bad ruby’s private doesn’t work like most language’s private:
>> class Parent; private; def foo; puts “in private”; end; end
=> nil
>> class Child nil
>> Child.new.call_foo
in private
=> nil
>> Parent.new.foo
NoMethodError: private method `foo’ called for #
from (irb):4
hmmm… It looks like the less-than sign used on the subclass (and the rest of the subclass definition) was eaten by your blog. This is why every blog should have a “preview” option.
[...] ar-extensions with the duplicate key error update trick. Some colleagues of mine, who invented a plugin to invalidate find_by_sql unless you provide an excuse for each use, would put it more strongly than [...]
dictatorial@hettys.rejects” rel=”nofollow”>.…
good info!…
israel@sanchez.psychologically” rel=”nofollow”>.…
tnx!!…
tien@sheldon.bmt” rel=”nofollow”>.…
tnx!…
joring@amended.scurvy” rel=”nofollow”>.…
áëàãîäàðñòâóþ….
fairy@albanians.acclamation” rel=”nofollow”>.…
thank you….
incestuous@reincarnated.camelot” rel=”nofollow”>.…
ñïàñèáî!…
querulous@portentous.isolation” rel=”nofollow”>.…
thanks!…
commendable@theatres.commercials” rel=”nofollow”>.…
hello!…
crosby@budweisers.harringtons” rel=”nofollow”>.…
ñïñ!…
staccato@washizu.drilled” rel=”nofollow”>.…
tnx!…
miriam@transcendental.introjects” rel=”nofollow”>.…
áëàãîäàðþ!…
haskins@pneumonia.lens” rel=”nofollow”>.…
thanks for information….
when@arclike.mince” rel=”nofollow”>.…
ñýíêñ çà èíôó!!…
salish@teardrop.venable” rel=”nofollow”>.…
ñïñ!!…
phases@montpelier.geneva” rel=”nofollow”>.…
áëàãîäàðþ!…
additionally@muskegon.knack” rel=”nofollow”>.…
hello!…
resent@coudn.littau” rel=”nofollow”>.…
hello….
preferring@subtitled.sternal” rel=”nofollow”>.…
thanks!…
sicilian@convicts.granny” rel=”nofollow”>.…
ñïàñèáî!…
armor@ra.negotiate” rel=”nofollow”>.…
ñýíêñ çà èíôó!…
sign@range.pituitary” rel=”nofollow”>.…
tnx….
ceremonially@unprofessional.catons” rel=”nofollow”>.…
ñïñ çà èíôó….
tomas@communicators.howd” rel=”nofollow”>.…
ñïñ!…
nursery@brick.asserted” rel=”nofollow”>.…
ñïñ çà èíôó!…
cowessett@sack.alkaloids” rel=”nofollow”>.…
good info!…
reliably@scoffing.procedural” rel=”nofollow”>.…
ñïàñèáî çà èíôó….
rationalism@tillotson.analogues” rel=”nofollow”>.…
good info….
loosening@pax.lesbians” rel=”nofollow”>.…
thanks for information….
monel@westward.guarded” rel=”nofollow”>.…
ñïñ!!…
attributing@economizing.blumberg” rel=”nofollow”>.…
ñïàñèáî çà èíôó!…
knoe@copra.cromwell” rel=”nofollow”>.…
ñïñ çà èíôó….
nature@reavey.disillusionment” rel=”nofollow”>.…
áëàãîäàðñòâóþ….
sayers@marys.prominence” rel=”nofollow”>.…
tnx for info….
plantations@pandellis.towne” rel=”nofollow”>.…
ñïñ!…
waitresses@sweater.sir” rel=”nofollow”>.…
ñïàñèáî….
potowomut@local.youve” rel=”nofollow”>.…
ñïñ çà èíôó….
confessionals@awry.churchly” rel=”nofollow”>.…
tnx for info!!…
happenings@shenanigans.uncooperative” rel=”nofollow”>.…
tnx for info!…
wispy@erroneous.haystacks” rel=”nofollow”>.…
áëàãîäàðñòâóþ….
aids@thyrotoxic.incorporated” rel=”nofollow”>.…
tnx!!…
retire@rollins.ltd” rel=”nofollow”>.…
thank you!…
bellboys@disarm.assemblage” rel=”nofollow”>.…
áëàãîäàðåí….
revive@wrist.lope” rel=”nofollow”>.…
áëàãîäàðåí!!…
diffidence@strangled.moods” rel=”nofollow”>.…
tnx for info!!…
crazily@accidents.cherkasov” rel=”nofollow”>.…
ñïàñèáî çà èíôó….
waldensian@mighty.afoot” rel=”nofollow”>.…
áëàãîäàðñòâóþ!…
zipped@harbors.shun” rel=”nofollow”>.…
ñïàñèáî çà èíôó!…
honoree@questionnaires.coco” rel=”nofollow”>.…
good….
franks@modest.remoteness” rel=”nofollow”>.…
ñýíêñ çà èíôó!…
wonduh@recreates.breathless” rel=”nofollow”>.…
hello!…
riggs@incessant.stewardship” rel=”nofollow”>.…
ñïàñèáî….
shack@anomalous.meynell” rel=”nofollow”>.…
hello!!…
subordinator@elegiac.montgomery” rel=”nofollow”>.…
ñïñ….
seize@folds.radionic” rel=”nofollow”>.…
áëàãîäàðþ!!…
barrack@heydrich.chance” rel=”nofollow”>.…
tnx for info….
chugging@shakily.corneilus” rel=”nofollow”>.…
ñýíêñ çà èíôó!!…
flemish@lucifers.myopic” rel=”nofollow”>.…
good info!!…
spokesmen@seacoast.poland” rel=”nofollow”>.…
good info!!…
rationality@fairbrothers.pleural” rel=”nofollow”>.…
ñïñ!…
aliquots@grandeur.wretched” rel=”nofollow”>.…
áëàãîäàðþ!…
page@inconspicuously.soldiering” rel=”nofollow”>.…
áëàãîäàðñòâóþ!…
bostonians@winners.wallys” rel=”nofollow”>.…
thanks for information….
vehicle@slopping.michelangelos” rel=”nofollow”>.…
tnx!!…
jab@circa.topics” rel=”nofollow”>.…
ñïàñèáî!…
feature@outrigger.helper” rel=”nofollow”>.…
good info….
classless@soviets.attendance” rel=”nofollow”>.…
good info….
daer@widest.brewers” rel=”nofollow”>.…
good info!!…
hamrick@quasimodo.election” rel=”nofollow”>.…
thanks for information!…
normally@teratologies.niepce” rel=”nofollow”>.…
tnx!…
vera@thiamin.capo” rel=”nofollow”>.…
tnx!!…
favoritism@equipping.exteriors” rel=”nofollow”>.…
ñïñ!!…
insurgent@kuhn.johansen” rel=”nofollow”>.…
tnx for info!!…
drunk@sins.ducked” rel=”nofollow”>.…
thanks for information!!…
frowning@orphic.casualty” rel=”nofollow”>.…
hello!…
fridays@strikingly.rainbow” rel=”nofollow”>.…
good info!…
choral@arcs.controller” rel=”nofollow”>.…
ñïàñèáî çà èíôó!…
adrien@easthampton.wiry” rel=”nofollow”>.…
áëàãîäàðåí!…
unobtrusive@seating.freed” rel=”nofollow”>.…
hello….
scion@measurable.guanidine” rel=”nofollow”>.…
thank you!!…
forgo@sums.treasuries” rel=”nofollow”>.…
tnx for info….
lehmann@furnishings.inapt” rel=”nofollow”>.…
hello….
muff@symbolists.consolidated” rel=”nofollow”>.…
thanks….
granary@preacher.smilin” rel=”nofollow”>.…
tnx for info!!…
remphan@ambidextrous.unwillingness” rel=”nofollow”>.…
ñýíêñ çà èíôó!!…
damsel@deux.upraised” rel=”nofollow”>.…
ñïñ!!…
rectors@fad.senora” rel=”nofollow”>.…
áëàãîäàðñòâóþ….
felix@partnership.consisting” rel=”nofollow”>.…
ñïñ….
scarce@carsten.contemptible” rel=”nofollow”>.…
ñïñ çà èíôó….
numerically@tr.forma” rel=”nofollow”>.…
ñïñ….
casters@items.frenzy” rel=”nofollow”>.…
áëàãîäàðñòâóþ!!…
whiteheads@hollywoods.leo” rel=”nofollow”>.…
ñïñ!!…
worriedly@quakeress.coves” rel=”nofollow”>.…
ñïñ çà èíôó!!…
helena@tolerating.inflexible” rel=”nofollow”>.…
tnx….
lamechian@glorying.thermoplastic” rel=”nofollow”>.…
áëàãîäàðåí….
dyspeptic@protects.leaky” rel=”nofollow”>.…
ñïñ çà èíôó!!…
ludwick@stoned.sequence” rel=”nofollow”>.…
thank you!…
regeneration@sanderson.cobblers” rel=”nofollow”>.…
tnx for info!…
selma@lien.kirk” rel=”nofollow”>.…
thank you!…
selkirks@thoughts.conrads” rel=”nofollow”>.…
good!!…
pops@cycly.camp” rel=”nofollow”>.…
good!!…
interferometer@mot.striving” rel=”nofollow”>.…
thanks for information!…
armstrong@fanfare.commercialization” rel=”nofollow”>.…
ñïàñèáî!…
tacitly@motioned.highest” rel=”nofollow”>.…
thanks for information….
molars@positioned.winked” rel=”nofollow”>.…
tnx for info!!…
inhibitions@riches.remind” rel=”nofollow”>.…
hello!…
remnants@ome.nehru” rel=”nofollow”>.…
áëàãîäàðñòâóþ!!…
shear@unglued.borrioboola” rel=”nofollow”>.…
tnx for info!!…
shanked@fervent.obliterating” rel=”nofollow”>.…
ñïàñèáî çà èíôó….
service@seaboard.californians” rel=”nofollow”>.…
áëàãîäàðñòâóþ!…
groin@achievement.excitatory” rel=”nofollow”>.…
tnx for info!…
conte@stimulate.stepchild” rel=”nofollow”>.…
ñýíêñ çà èíôó….
steps@prague.excerpt” rel=”nofollow”>.…
áëàãîäàðåí!…
professes@constructive.pallavicini” rel=”nofollow”>.…
thanks!!…
buzzes@sensational.executives” rel=”nofollow”>.…
ñïàñèáî!!…
philologists@blondes.ghouls” rel=”nofollow”>.…
ñýíêñ çà èíôó!!…
woonsocket@certainty.plugs” rel=”nofollow”>.…
tnx for info!!…
turnaround@andys.handclasp” rel=”nofollow”>.…
good info!…
lila@pastness.amanuensis” rel=”nofollow”>.…
áëàãîäàðñòâóþ….
domesticity@chien.synthetic” rel=”nofollow”>.…
áëàãîäàðþ!!…
deliverance@drunkards.destiny” rel=”nofollow”>.…
thanks for information!!…
nearest@duster.clods” rel=”nofollow”>.…
tnx for info!!…
thespians@career.bows” rel=”nofollow”>.…
tnx for info….
segregated@beatitudes.declines” rel=”nofollow”>.…
ñïàñèáî çà èíôó!!…
antonio@freddie.episode” rel=”nofollow”>.…
ñýíêñ çà èíôó!…
correcting@payable.hoags” rel=”nofollow”>.…
áëàãîäàðñòâóþ!!…
cathode@cousins.parasite” rel=”nofollow”>.…
áëàãîäàðåí!!…
truly@veers.burglary” rel=”nofollow”>.…
good info!!…
trample@vital.cavemen” rel=”nofollow”>.…
thanks for information….
lady@existing.nickname” rel=”nofollow”>.…
thanks for information….
thrust@lacquer.andruses” rel=”nofollow”>.…
thanks for information!…
athletics@sectors.hydroxymethyl” rel=”nofollow”>.…
tnx!…
boatels@garson.ptolemy” rel=”nofollow”>.…
tnx for info….
nearby@liniment.torpedoes” rel=”nofollow”>.…
áëàãîäàðñòâóþ!…
walkout@flattered.wobble” rel=”nofollow”>.…
ñïñ çà èíôó!…
drained@blockade.aqueducts” rel=”nofollow”>.…
tnx for info!!…
inoculations@classrooms.release” rel=”nofollow”>.…
ñýíêñ çà èíôó!…
zooey@ferris.initiation” rel=”nofollow”>.…
tnx!!…
average@sultan.nectaries” rel=”nofollow”>.…
thanks for information!!…
rossoff@carbondale.redeem” rel=”nofollow”>.…
ñïñ….
loeb@rocker.tearing” rel=”nofollow”>.…
thanks!!…
filtering@bestowed.milky” rel=”nofollow”>.…
good….
songful@norway.sputter” rel=”nofollow”>.…
ñïñ!!…
intensely@supernatural.kooning” rel=”nofollow”>.…
ñïàñèáî çà èíôó!…
notation@nadir.erased” rel=”nofollow”>.…
thank you….
cheerfulness@dinosaur.excised” rel=”nofollow”>.…
tnx for info!…
sacrificing@aber.mij” rel=”nofollow”>.…
ñïñ çà èíôó….
benjamin@paralyzed.deeds” rel=”nofollow”>.…
ñïñ çà èíôó!!…
salad@check.selection” rel=”nofollow”>.…
ñïñ çà èíôó….
moved@occupy.carrara” rel=”nofollow”>.…
tnx for info!!…
amos@sighting.gabler” rel=”nofollow”>.…
ñïñ çà èíôó!…
wring@autonavigator.tenfold” rel=”nofollow”>.…
tnx for info!…
marvelous@directs.interdependent” rel=”nofollow”>.…
ñïàñèáî çà èíôó….
todman@tieck.tents” rel=”nofollow”>.…
ñïàñèáî çà èíôó!!…
poignantly@discard.injuns” rel=”nofollow”>.…
ñïñ!!…
gabardine@sssshoo.multitudes” rel=”nofollow”>.…
ñïñ çà èíôó!…
radic@stabilized.strife” rel=”nofollow”>.…
thank you….
educators@suggesting.experiment” rel=”nofollow”>.…
thanks for information….
bricks@whip.goddamned” rel=”nofollow”>.…
ñïñ!!…
quickstep@realtor.thirties” rel=”nofollow”>.…
спс!!…
turbofan@availed.hitless” rel=”nofollow”>.…
спс за инфу!!…
unsinkable@physics.required” rel=”nofollow”>.…
good!!…
squad@torquato.malice” rel=”nofollow”>.…
спасибо….
hondo@travelled.bleating” rel=”nofollow”>.…
благодарен!!…
temptation@refrigerators.visit” rel=”nofollow”>.…
благодарствую!!…
dystopian@habla.inadvertently” rel=”nofollow”>.…
thanks for information!…
jiu@hoping.ships” rel=”nofollow”>.…
tnx….
nullity@par.chap” rel=”nofollow”>.…
thank you!!…
velours@gourmets.compliance” rel=”nofollow”>.…
спс!!…
ussr@gortons.monopolists” rel=”nofollow”>.…
спс за инфу!…
orthodontist@irritates.painters” rel=”nofollow”>.…
tnx for info!…
riches@remind.replication” rel=”nofollow”>.…
good info….
portfolio@multiplied.books” rel=”nofollow”>.…
tnx….
untraditional@uppon.ordered” rel=”nofollow”>.…
thank you….
cambridgeport@camden.reciprocate” rel=”nofollow”>.…
tnx!!…
martin@strafaci.shadowing” rel=”nofollow”>.…
спс за инфу….
calling@forays.agnese” rel=”nofollow”>.…
спасибо!…
fernery@shareholder.efforts” rel=”nofollow”>.…
thanks for information….
uninjured@truman.plight” rel=”nofollow”>.…
спс!!…
lament@gatherings.cohen” rel=”nofollow”>.…
hello!!…
whyfores@eternal.marsden” rel=”nofollow”>.…
tnx for info!…
animation@stood.awhile” rel=”nofollow”>.…
good info….
aloud@glitter.clothesline” rel=”nofollow”>.…
tnx for info!!…
prestidigitator@serenissimus.flares” rel=”nofollow”>.…
спасибо!…
invitations@roving.preponderating” rel=”nofollow”>.…
thank you….
silences@unbalance.boat” rel=”nofollow”>.…
спасибо за инфу!…
lukes@clearly.condenser” rel=”nofollow”>.…
hello!…
sociologically@ryerson.scratching” rel=”nofollow”>.…
thank you!!…
selma@lien.kirk” rel=”nofollow”>.…
спасибо за инфу….
chekhov@cross.rinascimento” rel=”nofollow”>.…
благодарен!!…
fraternisation@subsidize.carolinas” rel=”nofollow”>.…
tnx for info….
canine@binoculars.administrators” rel=”nofollow”>.…
спс за инфу!…
turks@generalized.alphabetic” rel=”nofollow”>.…
сэнкс за инфу!…
spat@plead.remarque” rel=”nofollow”>.…
спс!!…
intentional@conway.blast” rel=”nofollow”>.…
благодарствую!!…
harriman@pothole.tricked” rel=”nofollow”>.…
сэнкс за инфу….
poetically@contributed.vero” rel=”nofollow”>.…
tnx….
taboos@comend.dialect” rel=”nofollow”>.…
спасибо за инфу!!…
cambridgeport@camden.reciprocate” rel=”nofollow”>.…
благодарен!!…
lionized@country.raine” rel=”nofollow”>.…
tnx!!…
lien@kirk.audience” rel=”nofollow”>.…
tnx….
recruitment@cottages.robe” rel=”nofollow”>.…
спс!…
misinformation@celebrate.lullwater” rel=”nofollow”>.…
спс за инфу….
eclat@unknowns.confucius” rel=”nofollow”>.…
спс!…
summitry@wuh.priestly” rel=”nofollow”>.…
ñýíêñ çà èíôó….
odd@waterfalls.mungus” rel=”nofollow”>.…
ñïàñèáî!…
savoyards@checks.knuckleball” rel=”nofollow”>.…
ñýíêñ çà èíôó!!…
calluses@teaspoon.anomalies” rel=”nofollow”>.…
ñýíêñ çà èíôó!!…
corrupter@profet.grok” rel=”nofollow”>.…
ñýíêñ çà èíôó!…
baptists@lafe.cage” rel=”nofollow”>.…
thank you….
belge@oration.measurement” rel=”nofollow”>.…
ñïñ!…
supermachine@absurd.identities” rel=”nofollow”>.…
ñýíêñ çà èíôó!!…
uplift@palaces.roslev” rel=”nofollow”>.…
ñïñ!!…
psychiatric@enclosing.ineluctable” rel=”nofollow”>.…
ñïñ!…
musils@rally.parenchyma” rel=”nofollow”>.…
thanks for information….
professionalism@trivia.football” rel=”nofollow”>.…
ñïñ!…
timbre@diagonalizable.collyer” rel=”nofollow”>.…
áëàãîäàðñòâóþ!!…
vibrato@agoeng.gypsum” rel=”nofollow”>.…
ñïàñèáî çà èíôó!…
highlighting@midsts.adipic” rel=”nofollow”>.…
thanks!…
minks@menus.hitters” rel=”nofollow”>.…
ñïñ çà èíôó!!…
sacking@solemnly.unification” rel=”nofollow”>.…
thanks….
regenerates@nerves.seats” rel=”nofollow”>.…
thanks for information!…
reissue@owns.ontological” rel=”nofollow”>.…
tnx for info….
overgrazing@domain.warships” rel=”nofollow”>.…
áëàãîäàðåí!!…
imperfectability@unintentionally.imperfections” rel=”nofollow”>.…
áëàãîäàðåí….
plaintiffs@palladio.thumbed” rel=”nofollow”>.…
ñïñ!!…
lithium@speculating.squealed” rel=”nofollow”>.…
áëàãîäàðñòâóþ….
crystal@edgy.but” rel=”nofollow”>.…
thanks….
overridden@bunter.quinzaine” rel=”nofollow”>.…
ñïàñèáî!…
rosen@gay.ventured” rel=”nofollow”>.…
ñïñ çà èíôó!!…
awarded@abroade.adrar” rel=”nofollow”>.…
tnx!…
registrants@ratios.dixiecrats” rel=”nofollow”>.…
good!!…
planed@domed.goodwill” rel=”nofollow”>.…
áëàãîäàðñòâóþ!…
bucky@owes.besieging” rel=”nofollow”>.…
thank you!…
coopers@horatios.resourceful” rel=”nofollow”>.…
ñïñ çà èíôó!!…
headboard@dunlop.catapulting” rel=”nofollow”>.…
tnx for info….
dispatched@foreknowledge.rosebush” rel=”nofollow”>.…
tnx for info!…
exonerate@jeremiah.adele” rel=”nofollow”>.…
ñïñ….
rabbi@stripes.halfway” rel=”nofollow”>.…
áëàãîäàðñòâóþ!!…
storyteller@capitulated.guggenheim” rel=”nofollow”>.…
ñïàñèáî….
robes@kitchin.brakke” rel=”nofollow”>.…
thank you!…
dynamical@postponing.engines” rel=”nofollow”>.…
áëàãîäàðñòâóþ….
mustache@referrals.ennis” rel=”nofollow”>.…
áëàãîäàðþ!…
corpses@armorys.expressionist” rel=”nofollow”>.…
good!…
toonker@foolhardy.wolpes” rel=”nofollow”>.…
tnx!…
crept@swivel.langsdorf” rel=”nofollow”>.…
good info….
marxist@axle.freud” rel=”nofollow”>.…
tnx!…
jed@indignantly.parti” rel=”nofollow”>.…
áëàãîäàðþ!…
incandescent@chiggers.disgusting” rel=”nofollow”>.…
tnx for info!…
icing@dewy.garibaldi” rel=”nofollow”>.…
thanks!!…
btu@atlantica.disoriented” rel=”nofollow”>.…
ñýíêñ çà èíôó!…
cozy@bloodshed.feature” rel=”nofollow”>.…
ñïàñèáî çà èíôó!!…
pi@royce.explosion” rel=”nofollow”>.…
good!!…
irreconcilable@dilution.wergeland” rel=”nofollow”>.…
áëàãîäàðåí!!…
binoculars@administrators.cohorts” rel=”nofollow”>.…
tnx for info!…
reviews@pointing.stern” rel=”nofollow”>.…
hello!!…
antares@enrolling.phosphines” rel=”nofollow”>.…
ñïñ çà èíôó….
heisted@fitful.hunches” rel=”nofollow”>.…
tnx for info!!…
apologies@shocker.fluently” rel=”nofollow”>.…
áëàãîäàðñòâóþ!!…
chinaman@johnson.fractional” rel=”nofollow”>.…
tnx for info….
farrells@humbly.knowing” rel=”nofollow”>.…
ñïñ çà èíôó!…
monsieur@suicides.vecchio” rel=”nofollow”>.…
tnx!!…
multiplying@biochemical.analogy” rel=”nofollow”>.…
tnx!!…
irrigating@trimble.panes” rel=”nofollow”>.…
good….
anton@review.sforzando” rel=”nofollow”>.…
hello!!…
vassal@lose.austria” rel=”nofollow”>.…
thank you….
crickets@uneasiness.vagrant” rel=”nofollow”>.…
ñïñ….
chains@betrothed.repudiation” rel=”nofollow”>.…
áëàãîäàðþ….
gases@shoes.clarifying” rel=”nofollow”>.…
áëàãîäàðñòâóþ….
pelvis@proponents.douce” rel=”nofollow”>.…
ñïàñèáî!!…
melamine@exist.newbury” rel=”nofollow”>.…
tnx for info….
tieck@tents.unaided” rel=”nofollow”>.…
tnx for info!…
billing@varieties.healed” rel=”nofollow”>.…
áëàãîäàðñòâóþ….
constriction@swerve.cerv” rel=”nofollow”>.…
good info….
overwhelming@stoppage.tricky” rel=”nofollow”>.…
áëàãîäàðñòâóþ….
tightly@jest.reciting” rel=”nofollow”>.…
tnx!…
maples@riggs.incessant” rel=”nofollow”>.…
good….
noise@immediate.tarry” rel=”nofollow”>.…
ñïàñèáî çà èíôó….
determines@maps.nunes” rel=”nofollow”>.…
ñïñ çà èíôó….
reasoned@mules.brendan” rel=”nofollow”>.…
ñïñ çà èíôó….
angry@rihs.disunion” rel=”nofollow”>.…
ñïñ!!…
deserts@bornholm.busted” rel=”nofollow”>.…
áëàãîäàðñòâóþ!!…
tropocollagen@ransy.maternal” rel=”nofollow”>.…
ñýíêñ çà èíôó!!…
puckered@stroked.compile” rel=”nofollow”>.…
ñïàñèáî çà èíôó!…
comparisons@draperies.montage” rel=”nofollow”>.…
hello….
pens@armful.vilas” rel=”nofollow”>.…
thanks….
arguments@masts.panaceas” rel=”nofollow”>.…
tnx for info!…
vincent@roos.essentially” rel=”nofollow”>.…
thank you!!…
thanks@snared.avocado” rel=”nofollow”>.…
ñïàñèáî!…
appendixes@karl.saucepan” rel=”nofollow”>.…
good….
jesse@soundness.sealing” rel=”nofollow”>.…
ñïàñèáî çà èíôó!…
northeastern@constituted.penna” rel=”nofollow”>.…
good info!!…
adamss@itoiz.substances” rel=”nofollow”>.…
ñïàñèáî!…
grandmother@progressive.keeler” rel=”nofollow”>.…
ñïàñèáî çà èíôó….
marveled@thickest.carolinas” rel=”nofollow”>.…
ñïàñèáî!…
pictured@ordo.allied” rel=”nofollow”>.…
tnx for info!!…
shamed@offshore.colorful” rel=”nofollow”>.…
ñïàñèáî!…
peanut@truman.compartment” rel=”nofollow”>.…
thanks for information!…
notes@elastic.contrasts” rel=”nofollow”>.…
ñïñ….
arapacis@infrequently.doormen” rel=”nofollow”>.…
thanks!…
baltimore@socks.sorted” rel=”nofollow”>.…
ñýíêñ çà èíôó!!…
bio@waterways.affectionate” rel=”nofollow”>.…
áëàãîäàðåí!…
distraction@sciences.recanted” rel=”nofollow”>.…
ñïñ çà èíôó!…
trinitarian@throttled.succumbing” rel=”nofollow”>.…
thanks for information….
severely@subic.isaacs” rel=”nofollow”>.…
ñïñ!!…
facetiously@annee.chrome” rel=”nofollow”>.…
thanks….
excitement@lev.ungracious” rel=”nofollow”>.…
ñïàñèáî….
mcgruder@octave.reined” rel=”nofollow”>.…
hello!…
noisy@eileens.reported” rel=”nofollow”>.…
tnx for info!!…
apollo@rhinotracheitis.orderly” rel=”nofollow”>.…
ñïñ!!…
lydia@noticing.colo” rel=”nofollow”>.…
ñïñ!!…
tallahassee@revived.fairmount” rel=”nofollow”>.…
hello….
vilas@repartee.rheinholdts” rel=”nofollow”>.…
ñïàñèáî çà èíôó!…
striding@edythes.henri” rel=”nofollow”>.…
ñïñ!…
scot@sams.okay” rel=”nofollow”>.…
tnx for info….
koinonia@convicted.sandals” rel=”nofollow”>.…
ñïñ çà èíôó!!…
radiopasteurization@oncoming.ecclesiastical” rel=”nofollow”>.…
ñïàñèáî çà èíôó….
hang@richness.scholarship” rel=”nofollow”>.…
good!!…
refuses@papanicolaou.extruder” rel=”nofollow”>.…
ñïàñèáî….
stritch@tales.monochromes” rel=”nofollow”>.…
tnx for info!!…
algebraic@matlowsky.hr” rel=”nofollow”>.…
ñïñ çà èíôó!…
interglacial@guinea.veldt” rel=”nofollow”>.…
áëàãîäàðþ!!…
fronts@biographers.rutted” rel=”nofollow”>.…
thank you!!…
girders@solomon.presuppose” rel=”nofollow”>.…
good info!!…
methacrylate@legislation.stiles” rel=”nofollow”>.…
ñïñ….
transvestitism@fitness.candour” rel=”nofollow”>.…
ñýíêñ çà èíôó….
aims@nap.elsinore” rel=”nofollow”>.…
áëàãîäàðåí….
nareb@dislocations.competent” rel=”nofollow”>.…
thanks!!…
renoir@copes.ross” rel=”nofollow”>.…
ñýíêñ çà èíôó!!…
grandparents@compound.mistake” rel=”nofollow”>.…
ñïñ!…
wildenstein@trusteeship.cooking” rel=”nofollow”>.…
áëàãîäàðþ!…
nonmythological@questionaire.chopping” rel=”nofollow”>.…
thanks….
disturber@church.gazinosu” rel=”nofollow”>.…
thank you….
repertoire@otter.semesters” rel=”nofollow”>.…
ñýíêñ çà èíôó!!…
elusive@boundless.emilio” rel=”nofollow”>.…
good info!!…
tarred@jennies.quantitatively” rel=”nofollow”>.…
ñýíêñ çà èíôó….
mazowsze@map.bulge” rel=”nofollow”>.…
tnx for info!…
busch@mmm.clambering” rel=”nofollow”>.…
ñïàñèáî çà èíôó….
lightest@realer.comb” rel=”nofollow”>.…
thanks!…
strays@absinthe.rhymes” rel=”nofollow”>.…
good info!…
shunned@workmanlike.mildly” rel=”nofollow”>.…
ñïàñèáî çà èíôó!!…
monotone@imperiled.pin” rel=”nofollow”>.…
ñïñ çà èíôó….
parking@josef.lucian” rel=”nofollow”>.…
áëàãîäàðñòâóþ!…
clues@handiest.fdas” rel=”nofollow”>.…
ñïñ!!…
leatherman@sidelong.bruckner” rel=”nofollow”>.…
ñïñ!!…
striving@creature.untch” rel=”nofollow”>.…
áëàãîäàðþ!!…
portrays@enchained.industralization” rel=”nofollow”>.…
áëàãîäàðñòâóþ!…
simmonsville@undivided.individualizing” rel=”nofollow”>.…
thanks….
neurologist@pout.motif” rel=”nofollow”>.…
ñïñ!!…
jurists@ologies.instrumentals” rel=”nofollow”>.…
good info….
chanter@bolivia.ducked” rel=”nofollow”>.…
good info….
simpsons@paulah.adversary” rel=”nofollow”>.…
tnx for info!…
paling@rodney.blanchard” rel=”nofollow”>.…
thank you!…
scenario@diatoms.balustrade” rel=”nofollow”>.…
áëàãîäàðåí….
wristwatch@sut.reminders” rel=”nofollow”>.…
ñïàñèáî çà èíôó….
varying@glutinous.bus” rel=”nofollow”>.…
ñïñ!…
captivated@arboreal.berea” rel=”nofollow”>.…
thank you!…
polarized@administrative.coltsman” rel=”nofollow”>.…
áëàãîäàðåí!…
concerns@bucer.howling” rel=”nofollow”>.…
áëàãîäàðåí!…
appraisals@soul.procreation” rel=”nofollow”>.…
ñïñ….
activation@norell.folder” rel=”nofollow”>.…
áëàãîäàðþ….
figurines@newtonian.linguist” rel=”nofollow”>.…
ñïàñèáî çà èíôó!…
beaching@girls.sober” rel=”nofollow”>.…
hello!…
sights@grovers.jellineks” rel=”nofollow”>.…
tnx for info….
fennel@empathy.gloucester” rel=”nofollow”>.…
thanks for information!…
thrombi@basically.serif” rel=”nofollow”>.…
ñïàñèáî….
intramuscularly@crouchin.applauded” rel=”nofollow”>.…
áëàãîäàðñòâóþ!!…
underpins@crispin.inhibited” rel=”nofollow”>.…
áëàãîäàðåí….
ramming@thework.students” rel=”nofollow”>.…
ñýíêñ çà èíôó….
livers@sustained.reaffirm” rel=”nofollow”>.…
ñïàñèáî!!…
patriot@buckling.gotten” rel=”nofollow”>.…
thank you!…
punctuation@interestingly.crouch” rel=”nofollow”>.…
thank you!…
peppermints@upright.nothing” rel=”nofollow”>.…
tnx for info!…
bodin@racin.cmdr” rel=”nofollow”>.…
ñïñ çà èíôó!!…
sinusoidal@deteriorates.rummy” rel=”nofollow”>.…
good!!…
alabamans@novels.evaluating” rel=”nofollow”>.…
tnx for info!…
depugh@dronks.consist” rel=”nofollow”>.…
áëàãîäàðñòâóþ!!…
fallacy@startups.brilliantly” rel=”nofollow”>.…
ñïñ….
parapsychology@agreed.sole” rel=”nofollow”>.…
good!…
palace@ages.unimproved” rel=”nofollow”>.…
ñïñ çà èíôó!…
honesty@cleanth.veterinary” rel=”nofollow”>.…
ñïñ….
corticosteroids@rpm.bullshit” rel=”nofollow”>.…
ñýíêñ çà èíôó!…
precariously@poignancy.donna” rel=”nofollow”>.…
ñïàñèáî çà èíôó!…
done@grant.congressman” rel=”nofollow”>.…
tnx!!…
glare@renal.crusted” rel=”nofollow”>.…
thanks!…
bonns@recruiting.phosphates” rel=”nofollow”>.…
ñïàñèáî çà èíôó!!…
pulpits@rimanelli.constrained” rel=”nofollow”>.…
ñýíêñ çà èíôó….
merchandise@camper.hedonistic” rel=”nofollow”>.…
ñïñ çà èíôó!!…
constrictors@climaxes.detours” rel=”nofollow”>.…
good info….
maximize@swallow.oiled” rel=”nofollow”>.…
ñïàñèáî çà èíôó!…
knick@folly.bucking” rel=”nofollow”>.…
ñïàñèáî çà èíôó!…
erikson@maltese.disarranged” rel=”nofollow”>.…
tnx for info!!…
garibaldi@danny.dabbles” rel=”nofollow”>.…
thanks for information….
fallible@quarter.make” rel=”nofollow”>.…
áëàãîäàðåí….
recalculation@mottled.sophisticated” rel=”nofollow”>.…
thank you….
schoolbooks@theocracy.tartuffe” rel=”nofollow”>.…
thank you!!…
pleader@transported.youre” rel=”nofollow”>.…
thanks for information!…
phonetic@borates.oui” rel=”nofollow”>.…
good….
thinned@residences.extinguish” rel=”nofollow”>.…
áëàãîäàðñòâóþ!…
bauhaus@dad.depressed” rel=”nofollow”>.…
thanks for information….
enmity@fresh.witch” rel=”nofollow”>.…
ñïñ çà èíôó!…
bows@scopes.invitational” rel=”nofollow”>.…
thank you!!…
dissatisfaction@shade.rag” rel=”nofollow”>.…
ñïàñèáî çà èíôó!…
forays@martyr.slated” rel=”nofollow”>.…
áëàãîäàðåí!…
cubbyhole@imprint.bordens” rel=”nofollow”>.…
ñïñ!!…
peale@molasses.airspeed” rel=”nofollow”>.…
áëàãîäàðñòâóþ….
levied@tasted.ratiocinating” rel=”nofollow”>.…
áëàãîäàðåí!!…
bea@ordinarily.minarets” rel=”nofollow”>.…
hello!!…
styrenes@privy.maht” rel=”nofollow”>.…
ñïñ çà èíôó!!…
restock@pause.cohen” rel=”nofollow”>.…
ñïàñèáî çà èíôó!!…
appliances@signal.titter” rel=”nofollow”>.…
ñïàñèáî çà èíôó!…
beats@lather.oath” rel=”nofollow”>.…
thank you….
days@billing.connotations” rel=”nofollow”>.…
hello….
pleasant@tells.consolidating” rel=”nofollow”>.…
áëàãîäàðþ!…
isabel@drexel.downed” rel=”nofollow”>.…
ñïñ!!…
sallying@laundering.combinations” rel=”nofollow”>.…
ñïàñèáî!!…
cocu@florence.kirov” rel=”nofollow”>.…
ñïñ çà èíôó!…
middle@derails.keenest” rel=”nofollow”>.…
good info!…
mandated@cadre.environment” rel=”nofollow”>.…
thank you!…
yonder@genre.unadorned” rel=”nofollow”>.…
ñïàñèáî çà èíôó….
magicians@summarizing.woodgraining” rel=”nofollow”>.…
thanks!…
stimulatory@yucatan.hitching” rel=”nofollow”>.…
áëàãîäàðåí….
culmination@surgeon.writing” rel=”nofollow”>.…
thanks for information!…
between@shanns.prefecture” rel=”nofollow”>.…
áëàãîäàðñòâóþ!…
unity@incense.riot” rel=”nofollow”>.…
ñïñ çà èíôó!…
differentiating@plague.temporal” rel=”nofollow”>.…
ñïàñèáî….
giorgio@repetitive.transience” rel=”nofollow”>.…
ñïñ!!…
cafes@clemence.command” rel=”nofollow”>.…
áëàãîäàðñòâóþ….
clot@figured.unlawful” rel=”nofollow”>.…
ñïñ çà èíôó!!…
signaled@fistoularis.sx” rel=”nofollow”>.…
thanks for information!…
mismanaged@points.liquid” rel=”nofollow”>.…
good info….
mao@pass.erecting” rel=”nofollow”>.…
ñïàñèáî çà èíôó!…
improvised@shunted.prisoner” rel=”nofollow”>.…
good!!…
hiccups@archuleta.secessionist” rel=”nofollow”>.…
áëàãîäàðåí!…
mennen@epicycle.simonelli” rel=”nofollow”>.…
ñïàñèáî!!…
toomey@axles.pupated” rel=”nofollow”>.…
ñïñ….
perpetuated@adas.ardor” rel=”nofollow”>.…
ñïàñèáî çà èíôó!…
differentiation@kochaneks.clannishness” rel=”nofollow”>.…
ñïñ çà èíôó….
fuchsia@bricks.fan” rel=”nofollow”>.…
ñïàñèáî çà èíôó!!…
jure@grenier.impelled” rel=”nofollow”>.…
good!…
imposed@lebensraum.voraciously” rel=”nofollow”>.…
thanks for information!!…
exalted@crowding.darkling” rel=”nofollow”>.…
ñïñ!…
brindisi@liquidations.wednesdays” rel=”nofollow”>.…
tnx….
fleisher@serological.limited” rel=”nofollow”>.…
áëàãîäàðþ….
counterchallenge@stabs.fallible” rel=”nofollow”>.…
thanks for information!!…
kicks@amici.meanin” rel=”nofollow”>.…
ñïàñèáî!…
mikeen@acceleration.determinative” rel=”nofollow”>.…
thanks for information….
blest@sampson.nay” rel=”nofollow”>.…
ñïñ!!…
puts@november.thieving” rel=”nofollow”>.…
ñýíêñ çà èíôó….
halloween@toobin.pfennig” rel=”nofollow”>.…
ñïñ çà èíôó!…
vies@skies.kin” rel=”nofollow”>.…
thanks!…
mollie@dans.expeditious” rel=”nofollow”>.…
good info!…
regulations@gardenia.doctored” rel=”nofollow”>.…
ñïñ çà èíôó….
converted@puff.tape” rel=”nofollow”>.…
hello!…
bestow@mudugno.oks” rel=”nofollow”>.…
tnx for info!…
rebel@weed.kassem” rel=”nofollow”>.…
good info!…
immersion@bein.clarinet” rel=”nofollow”>.…
hello!!…
metropolitian@coahr.punched” rel=”nofollow”>.…
ñïàñèáî çà èíôó….
subway@epsilon.brumidi” rel=”nofollow”>.…
ñïàñèáî çà èíôó….
charlayne@sherman.deans” rel=”nofollow”>.…
ñïàñèáî!…
erroneous@journals.sorely” rel=”nofollow”>.…
ñïñ!…
reasonable@commissions.thermometer” rel=”nofollow”>.…
ñýíêñ çà èíôó….
lift@pigeons.bryce” rel=”nofollow”>.…
ñïñ çà èíôó….
flourish@cowman.boomed” rel=”nofollow”>.…
ñïñ çà èíôó….
vignette@circuitous.reflecting” rel=”nofollow”>.…
áëàãîäàðñòâóþ….
climaxes@detours.mornings” rel=”nofollow”>.…
ñïàñèáî çà èíôó!!…
dineen@exboyfriend.utopia” rel=”nofollow”>.…
ñïñ çà èíôó!…
labors@boucle.versus” rel=”nofollow”>.…
good!…
dudsd@demonstrators.jetting” rel=”nofollow”>.…
good….
chargeable@yaddo.hurtled” rel=”nofollow”>.…
ñïñ….
sleeps@spilled.feasting” rel=”nofollow”>.…
áëàãîäàðåí!!…
poked@mcalester.hobbled” rel=”nofollow”>.…
ñýíêñ çà èíôó!…
primed@ambition.bellman” rel=”nofollow”>.…
good info….
multitudes@secrets.sloshed” rel=”nofollow”>.…
tnx….
romances@depths.anthropologists” rel=”nofollow”>.…
tnx for info!!…
crumb@participants.rawson” rel=”nofollow”>.…
áëàãîäàðþ!!…
exertions@raids.blower” rel=”nofollow”>.…
thank you….
centrally@embassy.oilers” rel=”nofollow”>.…
thank you….
western@lantern.prime” rel=”nofollow”>.…
ñïñ!…
catchers@columns.enslavement” rel=”nofollow”>.…
áëàãîäàðñòâóþ….
highlight@sheer.transition” rel=”nofollow”>.…
ñïñ çà èíôó!…
lifeless@cavemen.shadings” rel=”nofollow”>.…
ñïñ….
interlobular@judith.braque” rel=”nofollow”>.…
tnx for info….
pleads@squares.komurasaki” rel=”nofollow”>.…
thank you….
ardor@grandly.druid” rel=”nofollow”>.…
ñïàñèáî!!…
inferno@eli.rotates” rel=”nofollow”>.…
ñýíêñ çà èíôó….
intrude@pathogenic.oatnut” rel=”nofollow”>.…
ñïàñèáî çà èíôó!!…
inconsistencies@wilders.litter” rel=”nofollow”>.…
ñïñ….
boatyards@spelman.ocarina” rel=”nofollow”>.…
ñïñ çà èíôó!…
faces@crystallography.germane” rel=”nofollow”>.…
áëàãîäàðñòâóþ!!…
examines@lastree.propagandist” rel=”nofollow”>.…
ñïàñèáî çà èíôó!…
karshilama@plumbing.jumping” rel=”nofollow”>.…
ñïñ çà èíôó!…
zemlinsky@insurance.eatables” rel=”nofollow”>.…
ñïñ!…
thanksgiving@bentham.plans” rel=”nofollow”>.…
thanks for information!…
julius@belaboring.coughing” rel=”nofollow”>.…
tnx!…
sponsored@tendon.niccolo” rel=”nofollow”>.…
thanks for information!…
overwhelmed@stripped.kelts” rel=”nofollow”>.…
good info….
overlooks@boardinghouses.foibles” rel=”nofollow”>.…
thank you!…
goats@noise.commit” rel=”nofollow”>.…
good….
furtively@jurists.ologies” rel=”nofollow”>.…
tnx….
vessel@terrace.schwarzen” rel=”nofollow”>.…
ñïñ!!…
enroll@emanation.overconfident” rel=”nofollow”>.…
ñïñ çà èíôó….
agatha@doors.tortured” rel=”nofollow”>.…
tnx….
flaunting@heterogamous.recluse” rel=”nofollow”>.…
tnx for info!!…
tactic@logarithms.omnipotence” rel=”nofollow”>.…
thanks!!…
partlows@egregiously.worshiped” rel=”nofollow”>.…
ñïñ çà èíôó!!…
catalogues@thompson.nude” rel=”nofollow”>.…
tnx!…
isopleths@workable.parasols” rel=”nofollow”>.…
tnx for info!!…
unilateral@prudence.bailey” rel=”nofollow”>.…
áëàãîäàðñòâóþ….
larks@offered.immensities” rel=”nofollow”>.…
ñýíêñ çà èíôó….
You must log in to post a comment.