Rails: has_many Запрос активной записи - PullRequest
1 голос
/ 10 ноября 2011

Мне интересно, как бы вы имитировали: 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`

Это заставит запрос вернуть мне подкатегории. Мысли? * * 1023

Спасибо заранее,

Justin

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Предполагая, что у вас есть на вашем 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 вместо этого?

0 голосов
/ 11 ноября 2011

В конечном итоге мне пришлось написать объединение, так как я не могу указать источник: как обычно, если бы создал отношения.

Category.joins("JOIN cat_sub_links ON cat_sub_links.subcategory_id=categories.id").where(: cat_sub_links => {:site_id => @site_ids})

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...