2

我正在建立一个 Rails 站点,但在关联方面遇到了麻烦。基本上我有以下几点:

class Publication < ActiveRecord::Base
  belongs_to :category
  has_one    :site, :through => :category
  named_scope :on_site,        lambda {|s| {:include => [:site], :conditions => ['sites.slug != ?', 's']}}
end
class Category
  belongs_to :site
  has_many   :publications
end
class Site
  has_many :categories
  has_many :publications, :through => :categories, :foreign_key => 'category_id'
end

Publication.first.site制作第一个出版物的网站,site.first.publications也是如此。

问题在于on_site命名范围,它会产生以下错误,例如Publication.on_site('s')

Mysql::Error: Unknown column 'categories.category_id' in 'on clause': SELECT 
`publications`.`id` AS t0_r0, `publications`.`shoot_id` AS t0_r1, 
`publications`.`category_id` AS t0_r2, `publications`.`title` AS t0_r3, 
`publications`.`slug` AS t0_r4, `publications`.`publish_on` AS t0_r5, 
`publications`.`created_at` AS t0_r6, `publications`.`updated_at` AS t0_r7, 
`publications`.`description` AS t0_r8, `publications`.`media_base_path` AS t0_r9, 
`sites`.`id` AS t1_r0, `sites`.`name` AS t1_r1, `sites`.`created_at` AS t1_r2, 
`sites`.`updated_at` AS t1_r3, `sites`.`slug` AS t1_r4, `sites`.`description` AS t1_r5, 
`sites`.`dhd_merch_id` AS t1_r6, `sites`.`members_area_url` AS t1_r7 FROM `publications`
 LEFT OUTER JOIN `categories` ON (`publications`.`id` = `categories`.`category_id`)  
 LEFT OUTER JOIN `sites` ON (`sites`.`id` = `categories`.`site_id`) WHERE (sites.slug != 's')

我需要那个加入是publications.category_id = categories.id,知道我有什么问题吗?

4

2 回答 2

2

好吧,这是您当前实现的一个问题:

LEFT OUTER JOIN `categories` ON (`publications`.`id` = `categories`.`category_id`)

该 SQL 片段由以下关联定义创建Site

has_many :publications, :through => :categories, :foreign_key => 'category_id'

foreign_key那里是不正确的。Rails 正在寻找一列categories被调用category_id,并期望该列的值与某个发布 ID 匹配。但是没有foreign_key可以设置的正确选项,因为categories表格看起来没有对publications表格的引用 - 它是相反的。

我不确定是否可以has_many :through通过中间has_many关联使 ActiveRecord 的关联工作。但我认为您可以使用嵌套关联功能来完成这项工作:

class Publication < ActiveRecord::Base
  belongs_to :category
  #has_one    :site, :through => :category
  named_scope :on_site,        lambda {|s| {:include => { :category => :site }, :conditions =>  ['sites.slug != ?', s]}}
end

另一个问题是您s在条件数组中加上引号。它不应该用引号引起来。

于 2009-05-17T03:04:22.240 回答
1

:joins好吧,如果有人感兴趣,我找到了使用范围选项的解决方案。我仍然想知道是否可以不使用:joins

  named_scope :on_site,        lambda {|s| {:joins =>
   ['LEFT OUTER JOIN `categories` ON  (`publications`.`category_id` = `categories`.`id`) ',
   'LEFT OUTER JOIN `sites`      ON  (`sites`.`id` = `categories`.`site_id`)'],
   :conditions => ['sites.slug = ?', s]}}
于 2009-05-07T19:03:13.200 回答