Ruby on rails 有一个在铁轨上吗?
我正在建立一个rails站点,并且与协会有问题。基本上,我有以下几点:Ruby on rails 有一个在铁轨上吗?,ruby-on-rails,activerecord,associations,Ruby On Rails,Activerecord,Associations,我正在建立一个rails站点,并且与协会有问题。基本上,我有以下几点: class Publication < ActiveRecord::Base belongs_to :category has_one :site, :through => :category named_scope :on_site, lambda {|s| {:include => [:site], :conditions => ['sites.slug != ?'
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
我需要那个连接成为出版物。category\u id=categories.id,知道我做错了什么吗?好吧,我找到了一个解决方案,如果有人感兴趣,可以使用作用域的
: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]}}
那么,您当前的实现有一个问题:
LEFT OUTER JOIN `categories` ON (`publications`.`id` = `categories`.`category_id`)
该SQL代码段是由站点中的此关联定义创建的:
has_many :publications, :through => :categories, :foreign_key => 'category_id'
外键不正确。Rails正在categories
中查找一个名为category\u id
的列,并希望该列的值与某个出版物id匹配。但您无法设置正确的外键
选项,因为categories
表看起来好像没有引用publications
表,所以情况正好相反
我不确定是否有可能使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
类发布:类别
命名的_范围:在_站点上,lambda{s}{:include=>{:category=>:site},:conditions=>['sites.slug!=?',s]}
结束
另一个问题是将s
放在条件数组的引号中。它不应该用引号括起来。我希望你能对Jesse的回复发表评论,因为它似乎是有效的。Jesse,我会在周一试一试,我很确定在我尝试加入之前,我已经尝试了所有这些东西,但都没有用(我很确定你发布的是我的第一个实现,在我刚刚开始做所有其他事情之前). 至于引用中的s,我不认为这真的是问题的关键。如果查看我粘贴的生成的SQL,则联接正在尝试将publication.id与category.category_id进行匹配。实际上,它需要publication.category_id与category.id进行匹配。哦,是的,引用的s
是一个完全独立的问题。我只是想指出这一点。好吧,看起来你发布的代码没有修复它,我仍然需要手动进行连接。您的命名范围会产生相同的错误,它会尝试查找一列站点\u出版物\u加入。类别\u id
不存在您是否尝试从站点中删除has\u many:publications…
行?这可能会让人困惑。
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