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.
