Ruby on rails 包括所有对象,但仅对ActiveRecord中的关联应用条件

Ruby on rails 包括所有对象,但仅对ActiveRecord中的关联应用条件,ruby-on-rails,ruby,ruby-on-rails-4,rails-activerecord,Ruby On Rails,Ruby,Ruby On Rails 4,Rails Activerecord,对于以下型号 class User < ActiveRecord::Base has_many :addresses # Has an attribute named active end class Address < ActiveRecord::Base # Has an attribute named city end 预期结果 下面的SQL查询可以生成该结果,但我无法找到一种方法让AR生成该查询或任何其他查询生成上述结果 select users.id, na

对于以下型号

class User < ActiveRecord::Base
  has_many :addresses
  # Has an attribute named active
end

class Address < ActiveRecord::Base
  # Has an attribute named city
end
预期结果 下面的SQL查询可以生成该结果,但我无法找到一种方法让AR生成该查询或任何其他查询生成上述结果

select users.id, name, street, city from users left join lateral (
  select * from addresses where addresses.user_id = users.id and city = 'Foo'
) addr on true
where users.active;
请试一试 外接程序
地址
型号

class Address < ActiveRecord::Base
  belongs_to :user  
end
试试这个


User.joins(“addresses.User\u id=users.id上的左连接地址”).where(活动:true)。选择(“users.*,if(addresses.city='Foo',addresses.city'')作为'city',if(addresses.city='Foo',addresses.street',)作为'street').order(“city”).group(:id).uniq(:id)
我想可以通过这种方式实现,我希望它可能是正确的:-

User.all.select{|a|a.active == true}.map(&:address).flatten.select{|v|v.city == "Foo" || v.city == ""}

我认为可以修改它以获得正确的结果。希望它能帮上忙,如果我做错了,请纠正我

这是
User.includes(:addresses).where(active:true).where(addresses:{city:'Foo'})
您在寻找什么?这排除了在“Foo”中没有任何地址的用户。您的请求不是很清楚,因为各种答案都无法提供您想要的结果。考虑给出几个具有不同地址组合的用户记录的例子,并显示期望的过滤结果。添加一些例子。不,这不是想要的。它排除了没有任何
地址
where
city:Foo
且需要单独查询以获取匹配地址的属性的用户。请尝试
内部联接
User。联接(:地址)将排除根本没有地址但实际上没有任何更改的用户。:)try.where(“users.active=?AND addresses.city=?”,true,“FOO”)这与Pavan在对该问题的直接评论中的建议有何不同?这排除了地址为“FOO”以外城市的用户。那么,为什么要使用
Foo
进行筛选?如果需要所有记录,您可以使用
group\u by
将结果与city
Foo
和city
or
进行分组。我已使用示例数据和结果更新了问题。希望这能澄清问题。它首先返回没有任何地址的
User
对象,当我尝试访问
addresses
属性时,它为每个用户触发一个查询,并包括所有地址,而不应用城市条件。您不需要通过
用户访问
地址
。地址
。该
地址已
加入
用户
表。您可以直接访问
user.city
user.street
class Address < ActiveRecord::Base
  belongs_to :user  
end
User.joins("LEFT JOIN addresses ON users.id=addresses.user_id").where("users.active=? AND addresses.city=?", true, "FOO")
User.all.select{|a|a.active == true}.map(&:address).flatten.select{|v|v.city == "Foo" || v.city == ""}