This is actually kind of a continuation of a previous thread, but that
one is solved.

http://groups.google.com/group/sequel-talk/browse_thread/thread/f683cb5bf8960c27

Using eager_graph plus the set_graph_aliases method lets me pull a
nice subset of data with associations in one query that works
perfectly. All the models still work as expected, etc. I added another
association in there (also a many to one) that linked to an article's
source (a magazine issue in most cases). Again, it worked perfectly.

Trouble began when I added authors into the mix which is a
many_to_many association since some articles have multiple authors.
This doesn't seem like a problem that can be handled in a single query
(I could be wrong, but joins basically create virtual tables which
does not lend itself to mixing in a many to many in that query).

So, this is the chain of methods I use to get my list:

Articles.order(:slug).
  eager_graph(lang).
  eager_graph(:source).
  set_graph_aliases(
    :id => [:articles, :id],
    :slug => [:articles, :slug],
    :title => [lang, :title],
    :summary => [lang, :summary],
    :source_slug => [:source, :slug],
    :source_title => [:source, :title]
  ).all

To grab all the authors in one query I replaced .all with:

.eager(:authors).all

And, basically, it seemed to work like I would have wanted. Two
queries and everything gets loaded. That :authors association looks
like this:

many_to_many :authors,
  :class => :ArticleAuthor,
  :left_key => :article_id,
  :right_key => :author_id,
  :join_table => :articles_authors_join

If I pull up a page that lists 5 articles, I get a query like this:

SELECT "article_authors".*, "articles_authors_join"."article_id" AS
"x_foreign_key_x" FROM "article_authors" INNER JOIN
"articles_authors_join" ON (("articles_authors_join"."author_id" =
"article_authors"."id") AND ("articles_authors_join"."article_id" IN
(637, 591, 462, 55, 688)))

Not a problem. However, if I grab a page with many more articles, I
get queries that look like this:

SELECT "article_authors".*, "articles_authors_join"."article_id" AS
"x_foreign_key_x" FROM "article_authors" INNER JOIN
"articles_authors_join" ON (("articles_authors_join"."author_id" =
"article_authors"."id") AND ("articles_authors_join"."article_id" IN
(637, 591, 462, 55, 688, 693, 705, 14, 463, 662, 114, 467, 263, 522,
24, 518, 595, 173, 240, 632, 153, 469, 493, 509, 500, 502, 115, 626,
601, 47, 480, 7, 8, 489, 543, 594, 31, 630, 631, 65, 75, 560, 692,
438, 486, 491, 521, 503, 675, 123, 29, 56, 520, 45, 217, 615, 372,
453, 451, 447, 513, 514, 616, 618, 619, 515, 404, 410, 414, 508, 704,
567, 703, 538, 195, 405, 137, 634, 685, 205, 204, 202, 201, 196, 578,
1, 681, 627, 478, 298, 690, 472, 209, 200, 22, 12, 28, 608, 4, 21,
464, 58, 663, 362, 497, 454, 439, 182, 183, 181, 572, 458, 396, 250,
643, 403, 241, 116, 291, 292, 603, 695, 145, 147, 426, 391, 564, 569,
565, 573, 459, 415, 620, 511, 33, 428, 542, 41, 49, 244, 470, 628, 23,
600, 186, 172, 171, 170, 294, 267, 160, 281, 286, 287, 268, 265, 283,
284, 161, 285, 38, 606, 238, 237, 236, 316, 337, 317, 318, 319, 320,
321, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335,
336, 338, 339, 239, 340, 341, 342, 343, 345, 346, 347, 348, 349, 350,
351, 353, 354, 355, 356, 168, 117, 697, 682, 457, 607, 30, 609, 26,
455, 119, 57, 37, 653, 408, 411, 194, 534, 461, 39, 651, 561, 541,
553, 483, 536, 302, 178, 549, 125, 366, 563, 258, 579, 580, 169, 419,
420, 658, 566, 79, 128, 650, 425, 197, 253, 142, 304, 684, 435, 295,
533, 612, 86, 102, 88, 95, 406, 412, 645, 687, 654, 468, 465, 216,
309, 382, 77, 311, 251, 121, 140, 144, 146, 152, 235, 80, 535, 532,
445, 93, 127, 269, 537, 313, 100, 429, 305, 635, 108, 660, 666, 104,
97, 103, 597, 701, 87, 107, 206, 584, 118, 421, 577, 98, 545, 199, 82,
139, 374, 375, 562, 99, 586, 364, 365, 370, 373, 376, 446, 307, 245,
400, 84, 649, 89, 255, 254, 528, 557, 252, 90, 81, 495, 402, 94, 151,
656, 92, 674, 571, 574, 203, 531, 529, 501, 393, 96, 296, 524, 527,
397, 424, 76, 444, 440, 300, 661, 613, 109, 85, 106, 165, 702, 519,
226, 390, 141, 371, 78, 110, 166, 523, 481, 314, 310, 315, 83, 399,
368, 162, 707, 143, 91, 582, 686, 52, 34, 36, 62, 494, 617, 213, 51,
437, 149, 401, 409, 135, 297, 63, 17, 544, 546, 525, 596, 13, 5, 540,
312, 60, 156, 694, 301, 282, 646, 218, 193, 207, 35, 539, 479, 398,
184, 668, 669, 670, 673, 485, 46, 155, 20, 434, 698, 352, 691, 322,
585, 593, 308, 505, 136, 154, 556, 167, 504, 132, 192, 450, 72, 71,
659, 70, 68, 303, 67, 69, 73, 66, 306, 709, 357, 219, 359, 220, 360,
361, 379, 380, 381, 383, 384, 385, 386, 387, 221, 388, 210, 10, 407,
32, 344, 449, 148, 640, 101, 621, 214, 499, 548, 592, 678, 185, 583,
547, 442, 11, 293, 120, 443, 623, 611, 138, 602, 9, 587, 590, 676,
261, 27, 74, 416, 507, 159, 6, 498, 367, 581, 377, 215, 605, 473, 43,
157, 131, 436, 696, 112, 259, 477, 189, 211, 506, 133, 130, 134, 208,
648, 700, 187, 394, 61, 180, 369, 242, 568, 198, 488, 105, 644, 129,
657, 177, 604, 433, 278, 664, 555, 158, 647, 476, 273, 25, 456, 228,
231, 229, 230, 234, 227, 232, 224, 233, 225, 223, 622, 176, 706, 18,
363, 260, 510, 636, 638, 639, 641, 598, 222, 679, 427, 389, 243, 699,
418, 40, 175, 448, 625, 559, 624, 570, 44, 212, 42, 667, 3, 174, 378,
677, 430, 708, 614, 552, 672, 633, 642, 665, 599, 466, 710, 262, 16,
417, 2, 54, 558, 64, 655, 15, 680, 432, 48, 59, 126, 257, 190, 50,
422, 652, 554, 551, 460, 191, 392, 576, 588, 288, 289, 290, 274, 275,
276, 277, 256, 272, 279, 280, 264, 266, 270, 271, 413, 113, 53, 19,
179, 423)))

This doesn't seem like it's gonna scale well. Is there a better way to
do this? I can always do my own query to grab the authors as separate
dataset and go from there, but that doesn't seem like the most elegant
solution either.

(Realistically, the lists will be paginated so this query isn't likely
to occur in reality. As an exercise though, I find it interesting.)

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sequel-talk?hl=en.

Reply via email to