我正在构建一个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'
endPublication.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,知道我哪里搞错了吗?
发布于 2009-05-17 03:04:22
好的,这是你当前实现的一个问题:
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关联来使ActiveRecord的has_many :through关联工作。但我认为您可以使用嵌套关联功能来实现此功能:
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-07 19:03:13
如果有人感兴趣的话,我找到了一个使用范围的: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]}}https://stackoverflow.com/questions/836317
复制相似问题