2011-11-10 158 views
1

我想知道你将如何模拟has_many:通过使用AR调用。Rails:has_many活动记录查询

最终,我试图找到属于网站的子类别,而不是顶级类别,这是查询目前给我的。

型号:

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` 

这将导致查询返回我的子类别。思考?

在先进的感谢,

贾斯汀

回答

0

最终,我不得不编写连接,因为我无法像创建关系一样指定source:source。

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

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

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代替它会更好吗?

+0

谢谢卢克,你的回答是对的,但在我的具体情况下,我无法建立这种关系。 – Justin