#ruby-on-rails #ruby-on-rails-3 #activerecord
#ruby-on-rails #ruby-on-rails-3 #activerecord
Вопрос:
Мне интересно, как бы вы смоделировали :has_many: с помощью AR-вызова.
В конечном счете, я пытаюсь найти подкатегории, которые принадлежат сайту, а не категории верхнего уровня, которые в настоящее время выдает мне запрос.
Модели:
class Categories < AR
:has_many :subcategories, :through => :cat_subcat_links
:has_many :cat_subcat_links
end
Модель компоновки:
class CatSubcatLinks < AR
:category_id
:subcategory_id
:site_id
end
На данный момент, если я хочу узнать, какие категории принадлежат определенному сайту, я выполняю:
Category.joins(:cat_subcat_links).where(:cat_subcat_links => {:site_id => 1})
Запрос, который возвращает:
SELECT `categories`.* FROM `categories` INNER JOIN `cat_sub_links` ON `cat_sub_links`.`category_id` = `categories`.`id` WHERE `cat_sub_links`.`site_id` = 1
Проблема в том, что
`cat_sub_links`.`category_id` = `categories`.`id`
Мне нужно, чтобы это говорило
`cat_sub_links`.`subcategory_id` = `categories`.`id`
Это приведет к тому, что запрос вернет мне подкатегории. Мысли?
Заранее спасибо,
Джастин
Ответ №1:
Предполагая, что у вас есть в вашем site.rb
class Site < AR
has_many :cat_subcat_links
has_many :subcategories, :through => :cat_subcat_links
has_many :categories, :through => :cat_subcat_links
end
Не могли бы вы просто сделать:
Site.find([your_site_id]).categories
Также:
Site.find([your_site_id]).subcategories
Также просто мысль; вы уверены, что не было бы лучше использовать acts_as_tree или awesome_nested_set вместо этого?
Комментарии:
1. Спасибо, Люк, ваш ответ был бы правильным, но в моем конкретном случае я не могу создать связь.
Ответ №2:
В конечном счете, мне пришлось вместо этого написать join, поскольку я не могу указать:source, как я обычно делал бы, если бы создавал связь.
Category.joins("JOIN cat_sub_links ON cat_sub_links.subcategory_id=categories.id").where(: cat_sub_links => {:site_id => @site_ids})
Я оставлю ответ на несколько дней, если у кого-нибудь есть более элегантное решение.