我有两个模型加入了一个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子句的例子.也许是不可能的
更新:
←[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,而参数在哪里.
其中接受一个哈希,其键是表名,值是散列(它们本身的列名称作为键).它只是在两个表中定位具有相同名称的列时防止歧义.
这也解释了为什么你的第二个问题出现:关系作者不存在.