Rails: запрос активной записи has_many

#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})
  

Я оставлю ответ на несколько дней, если у кого-нибудь есть более элегантное решение.