加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 20:39:14 所属栏目:百科 来源:网络整理
导读:我有两个模型加入了一个has_many:通过关系: class Publication ActiveRecord::Base has_many :publication_contributors has_many :contributors,:through = :publication_contributorsendclass Contributor ActiveRecord::Base has_many :publication_con
我有两个模型加入了一个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,而参数在哪里.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读