【问题标题】:Rails SQL: How to join belongs_to association in query that is referenced twice with two foreign keysRails SQL:如何在使用两个外键引用两次的查询中加入 belongs_to 关联
【发布时间】:2019-11-16 18:10:10
【问题描述】:

在我的应用程序中,我有一个 Event 模型,它基本上代表两个用户之间的预订。它有一些关于事件的基本属性以及booker_idbookee_id,它们都代表User 表中的外键。

基本上,我正在尝试为事件组合一个搜索方法,该方法允许我按预订者或预订者的名字和姓氏进行搜索。但我不知道如何在一个查询中同时引用bookee 用户和booker 用户。下面是我的事件模型,显示了我设置的事件搜索类方法的关联和基本版本。不幸的是,它似乎只引用了事件bookers 的用户表,而不是bookees。我可能只需要检查我的 SQL 并写一些更难看的东西,但是如果有人有一种直接的方法来调整该查询,以便它可以包含并引用 bookee 用户和 booker 用户的 User 表会很有帮助的。

事件.rb

belongs_to :booker, :foreign_key => :booker_id, class_name: 'User'
belongs_to :bookee, :foreign_key => :bookee_id, class_name: 'User'

def self.search(search)
  if search
    search_term = "%#{search}%"
    includes(:booker, :bookee).where(["users.first_name ILIKE :term OR users.last_name ILIKE :term OR event_title ILIKE :term", {term: search_term}]).references(:booker, :bookee)
  end
 end

用户.rb

  has_many :booker_events, :foreign_key => :booker_id, class_name: 'Event', dependent: :nullify
  has_many :bookee_events, :foreign_key => :bookee_id, class_name: 'Event', dependent: :nullify

【问题讨论】:

    标签: sql ruby-on-rails postgresql activerecord


    【解决方案1】:

    您可以尝试使用自定义连接来匹配users 表中的那些行,其中它们的idevents 表中的booker_id 和/或bookee_id 相同:

    Event
      .joins('INNER JOIN users ON users.id IN (events.booker_id, events.bookee_id)')
      .where(
        'users.last_name  ILIKE :term OR
         users.first_name ILIKE :term OR
         event_title      ILIKE :term',
        term: term)
    

    【讨论】:

    • 表名是users,所以当我运行这样的语句时,引用booker.first_name 或其他任何内容时,我得到的错误类似于ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: missing FROM-clause entry for table "booker"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多