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 Robinsonn' 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,而参数在哪里. 其中接受一个哈希,其键是表名,值是散列(它们本身的列名称作为键).它只是在两个表中定位具有相同名称的列时防止歧义. 这也解释了为什么你的第二个问题出现:关系作者不存在. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |