ruby-on-rails – Rails:找到一个与where子句的深度嵌套关联

我有两个模型加入了一个has_many:通过关系:
class Publication < ActiveRecord::Base
  has_many :publication_contributors
  has_many :contributors,:through => :publication_contributors
end

class Contributor < ActiveRecord::Base
  has_many :publication_contributors
  has_many :publications,:through => :publication_contributors
end

class PublicationContributor < ActiveRecord::Base
  belongs_to :publication
  belongs_to :contributor
end

(关于我的PublicationContributor模型,不寻常和重要的是它不仅仅有一对数据库ID,它还有一个名为contributor_type的字符串属性,该字符串可能包含“Author”或“Translator”或“Publisher”等角色.我不相信这是这里的问题,但解决方案仍然需要解决.)

我想找到一个具有这样的具体贡献者的出版物:

Publication
  .joins(:publication_contributors =>  :contributor)
  .where(:publication_contributors => 
            {:contributor_type => "Author",:contributor => {:name => params[:authors]}})

一切正常,直到我得到嵌套:贡献者,在那时SQL溢出:

Mysql2::Error: Unknown column 'publication_contributors.contributor' in 'where clause'

而不是寻找publication_contributors.contributor_id,它正在寻找publication_contributors.contributor,它不存在.我在代码中做错了吗?我没有找到任何其他具有深层嵌套关联的where子句的例子.也许是不可能的

更新:

生成的SQL

←[1m←[35mPublication Load (0.0ms)←[0m  SELECT `publications`.* FROM `publicati
ons` INNER JOIN `publication_contributors` ON `publication_contributors`.`public
ation_id` = `publications`.`id` INNER JOIN `contributors` ON `contributors`.`id`
 = `publication_contributors`.`contributor_id` WHERE `publication_contributors`.
`contributor_type` = 'Author' AND `publication_contributors`.`contributor` = '--
-\n:name:\n- Marilynne Robinson\n' LIMIT 1

此外,我在我的出版物模型中有这个协会:

has_many :authors,:through => :publication_contributors,:source => :contributor,:conditions => {:publication_contributors => {:contributor_type => "Author"}}

我在想我可以做到这一点:

Publication.joins(:authors).where(:authors => {:name => params[:authors]})

但是这会抛出错误:

Mysql2::Error: Unknown column 'authors.name' in 'where clause'

解决方法

尝试改变你的where子句:
Publication
  .joins( :publication_contributors => :contributor )
  .where( :publication_contributors => {:contributor_type => "Author"},:contributors             => {:name => params[:authors]} )

ActiveRecord api在这里并不是非常一致:参数在哪里不能像连接那样正常工作.这是因为连接的参数不反映底层SQL,而参数在哪里.

其中接受一个哈希,其键是表名,值是散列(它们本身的列名称作为键).它只是在两个表中定位具有相同名称的列时防止歧义.

这也解释了为什么你的第二个问题出现:关系作者不存在.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...