Rails:has_many活动记录查询

时间:2011-11-10 10:51:08

标签: ruby-on-rails ruby-on-rails-3 activerecord

我想知道如何模拟a: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`

这将导致查询返回子类别。想法?

先谢谢了,

贾斯汀

2 个答案:

答案 0 :(得分: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_treeawesome_nested_set而不是更好吗?

答案 1 :(得分:0)

最终,我必须编写连接,因为我无法指定:源代码,就像我通常会创建关系一样。

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

如果有人有更优雅的解决方案,我会留下几天的答案。