Можете ли вы присоединиться к другому столу, который не является ассоциацией в ARel? - PullRequest
2 голосов
/ 16 августа 2011

У меня есть какой-то SQL, который работает, когда я хочу найти определенные страницы, которым назначены определенные схемы (все через schema_assignment):

Page.find_by_sql("
    SELECT pages.id
    FROM pages
    INNER JOIN scheme_assignments ON (scheme_assignments.schemable_type = 'Page' AND
                                      scheme_assignments.schemable_id = pages.sid)
    INNER JOIN schemes ON (schemes.sid = scheme_assignments.scheme_id AND
                           schemes.sid IN (4,6,7))
    GROUP BY pages.id")

Когда я пытался преобразовать это вARel:

Page.select("pages.id")
    .joins("scheme_assignments")
    .on("scheme_assignments.schemable_type = 'Page' AND scheme_assignments.schemable_id = pages.sid")
    .joins("schemes")
    .on("schemes.sid = scheme_assignments.scheme_id AND schemes.sid IN (1)")
    .group("pages.id")

Я бы получил эту ошибку: NoMethodError: undefined method join_sql 'для "схем": String`

Почему?Это потому, что это не ассоциация в моей Page модели?Можно ли преобразовать этот SQL в ARel без создания ассоциаций в модели?

Ответы [ 2 ]

8 голосов
/ 16 августа 2011
Page.joins("INNER JOIN scheme_assignments 
        ON (scheme_assignments.schemable_type = 'Page' AND scheme_assignments.schemable_id = pages.sid) 
        INNER JOIN schemes 
        ON (schemes.sid = scheme_assignments.scheme_id AND schemes.sid IN (4,6,7))").
    select("DISTINCT pages.*");
1 голос
/ 16 августа 2011

Rails Guides

Когда у вас настроена ассоциация, Rails знает, какой тип объединения использовать.Я думаю (не пробовал, хотя) это должно работать следующим образом:

Page.select("pages.id").joins("INNER JOIN scheme_assignments ON (scheme_assignments.schemable_type = 'Page' AND scheme_assignments.schemable_id = pages.sid)")...
...