【问题标题】:search association having class_name具有 class_name 的搜索关联
【发布时间】:2016-11-28 12:13:42
【问题描述】:

我有一个如下所示的 Book 模型:

class Book < ActiveRecord::Base
  belongs_to :author, class_name: 'User', touch: true
  belongs_to :translator, class_name: 'User'
end

如何搜索具有特定作者姓名的书籍?我先加入表格:

Book.joins(:author).joins(:translator)

但我不能链接

.where('authors.name = "Tolkien"')

因为数据库中没有“authors”表。是

.where('users.name = "Tolkien"')

这里有安全的方法吗?译者和作者实际上都是用户,是否没有风险? (select() 方法不是一个选项,我需要 activerecord::relation)

【问题讨论】:

  • 请分享数据库结构。如果这本书有两位作者,会发生什么? 三个翻译?
  • 您可以使用where({author: {name: 'Jon'}, translator: {name: 'Doe'}}) 或手动编写连接并手动为其命名。

标签: mysql ruby-on-rails ruby activerecord


【解决方案1】:

您需要在查询中传递表名

Book.joins(:author).where(users: {name: 'Tolkien'})

.where('users.name = "Tolkien"') 在这里安全吗?

如果您担心使用同一个表的两个关联,您可能需要添加一个字段来区分它们

例如。一个布尔字段author 并使用关联条件来解决问题

class Book < ActiveRecord::Base
  belongs_to :author, -> { where(author: true) }, class_name: 'User', touch: true
  belongs_to :translator, -> { where(author: false) }, class_name: 'User'
end

【讨论】:

  • 它不是我可以使用的解决方案,因为用户可以是一本书的作者和另一本书的翻译
  • 那么您可以接受查询将返回用户是作者和翻译者的书籍这一事实
猜你喜欢
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多