gpt4 book ai didi

ruby-on-rails - rails : Finding a deeply nested association with a where clause

转载 作者:行者123 更新时间:2023-12-03 11:48:49 35 4
gpt4 key购买 nike

我有两个模型加入了 has_many :through 关系:

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 的字符串属性。该字符串可以包含诸如“作者”或“翻译者”或“发布者”之类的角色。我不相信这是这里的问题,但解决方案仍然必须解决它。)

我想找到一个具有特定贡献者的出版物,如下所示:
Publication
.joins(:publication_contributors => :contributor)
.where(:publication_contributors =>
{:contributor_type => "Author",
:contributor => {:name => params[:authors]}})

一切正常,直到我到达嵌套的 :contributor,此时 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

另外,我的 Publications 模型中有这个关联:
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 在这里不是非常一致: where 的参数与 joins 的工作方式不完全相同.这是因为 joins 的参数不反射(reflect)底层 SQL,而 where 的参数做。
where接受键为 的散列表名 , 值是散列(它们本身以列名作为键)。它只是在定位两个表中具有相同名称的列时防止歧义。

这也解释了为什么会出现第二个问题:关系 authors不存在。

关于ruby-on-rails - rails : Finding a deeply nested association with a where clause,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14527051/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com