【问题标题】:Rails 3 has many through query all parent records and only include children that meet conditionsRails 3 有很多通过查询所有父记录并且只包括满足条件的子记录
【发布时间】:2013-09-01 19:08:53
【问题描述】:

我有一个关系,餐厅可以通过称为操作的中间表拥有许多用户,并且用户也可以通过操作拥有许多餐厅。

我正在尝试查询所有餐厅,并且只包括满足特定条件的用户;无论是否没有满足搜索条件的用户,或者根本没有与之关联的用户,都应该返回该餐厅。我的模型如下。

餐厅型号:

has_many :actions
has_many :users, through: :actions

动作模型:

belongs_to :user
belongs_to :restaurant

用户模型:

has_many :actions
has_many :restaurants, through: :actions

【问题讨论】:

    标签: sql ruby-on-rails ruby-on-rails-3 activerecord eager-loading


    【解决方案1】:

    对于这种情况,您需要做的是使用左外连接。如果您只是创建联接以查找具有特定属性的用户,例如:

       Restaurant.joins(:users).where("users.name LIKE 'user_name'")
    

    隐式创建了一个内部连接,它将排除所有没有用户的餐厅。要包含它们,请执行以下操作:

    Restaurant.joins(["LEFT OUTER JOIN actions on restaurants.id = actions.user_id", "LEFT OUTER JOIN users on users.id = actions.user_id"]).where("users.name LIKE 'James' OR users.name IS NULL ")
    

    【讨论】:

    • 您的回答只解决了我的部分问题。该查询返回用户满足用户搜索条件的餐厅,以及没有任何用户的餐厅。但是,它不会返回用户不符合搜索条件的餐厅。我需要它来返回所有餐厅,无论他们是否有匹配的用户,以及他们是否没有用户;而只包括满足搜索条件的用户。如果您需要更多说明,请告诉我。
    • 如果您希望它返回不符合查询条件的用户的餐厅,那么为什么要添加它们?你能给我一个具体的例子来说明你希望查询返回什么吗?
    • 我不确定我是否可以比我原来的问题更好/不同。 “我正在尝试查询所有餐厅,并且只包括满足某些条件的用户;无论是否没有满足搜索条件的用户,或者根本没有与之关联的用户,都应该返回该餐厅。”
    • 您的声明“只包含满足特定条件的用户;无论没有满足搜索条件的用户,都应返回餐厅”是互斥的。给我一个例子,说你想要/不想要什么返回
    • 请让我知道这是否足够具体。假设我要返回所有餐厅,并包括与该餐厅关联的所有年龄在 20 到 30 岁之间的用户(年龄是用户模型上的一个属性)。正如我之前所说,如果没有满足与餐厅相关的条件的用户,则仍应退回该餐厅。
    猜你喜欢
    • 2017-07-15
    • 2017-11-26
    • 2020-09-03
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多