如何编写这个 many_to_many ActiveRecord 查询?

Posted

技术标签:

【中文标题】如何编写这个 many_to_many ActiveRecord 查询?【英文标题】:How do I write this many_to_many ActiveRecord query? 【发布时间】:2021-10-21 01:22:04 【问题描述】:

在这个例子中,我想要所有具有Rubyhtml languagesprojects,它们是通过project_languages 的多对多关系。

class Project
  has_many :project_languages
  has_many :languages, through: :project_languages
end

class Language 
  has_many :project_languages
  has_many :projects, through: :project_languages
end

class ProjectLanguage
  belongs_to :project
  belongs_to :language
end

我正在尝试,但返回一个空数组:

Project.joins(:languages).where('languages.name = ? AND languages.name = ?', 'Ruby', 'HTML')

这会返回预期的结果,但我认为必须有一种更简单的方法:

Project.joins(:languages).where(languages: name: 'Ruby' ) & (Project.joins(:languages).where(languages: name: 'HTML' ))

【问题讨论】:

【参考方案1】:

您的解决方案似乎不错。但这里有一个替代

Language.find_by(name: 'Ruby')&.projects & Language.find_by(name: 'HTML')&.projects

如果你在一个变量中有你想要的语言。这可能是一个更简单的解决方案。

【讨论】:

谢谢!我没想过要那样做。 Language.where(name: ['Ruby', 'HTML]).map(&:projects).inject(:&) 。刚刚发现了一个更简单、更酷的外观。这给出了相同的结果。 哈哈“酷”加分。再次感谢!

以上是关于如何编写这个 many_to_many ActiveRecord 查询?的主要内容,如果未能解决你的问题,请参考以下文章

Elixir ecto 2 创建 many_to_many 关联

如何正确编写我的 clickhouse sql 查询?

Ecto:在 many_to_many 查询中包含连接模式字段

grails many_to_many 自定义映射表

计算两个 GPS 坐标之间的距离

Rails 5 - 如何添加UUID列