Ruby on 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 != ?'

我正在建立一个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

我需要那个连接成为出版物。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