通过具有额外条件的联接获取所有记录

时间:2014-02-20 07:10:55

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord

“邻里”属于“城市”。 “城市”有很多“社区”。

如何通过城市名称选择属于特定城市的所有社区?城市名称是存储在城市表中的属性。

Neighborhood.joins(:city)将使用此SQL获取所有社区:

SELECT "neighborhoods".* 
FROM "neighborhoods" 
INNER JOIN "cities" 
ON "cities"."id" = "neighborhoods"."city_id"

但是使用这个SQL执行查询的Rails方式是什么(唯一的区别是最后一行)?

SELECT "neighborhoods".* 
FROM "neighborhoods" 
INNER JOIN "cities" 
ON "cities"."id" = "neighborhoods"."city_id"
AND "cities"."name" = "New York"

4 个答案:

答案 0 :(得分:1)

只需使用cities.name

应用where条件
Neighborhood.joins(:city).where("cities.name = ?", "New York")

答案 1 :(得分:1)

执行此操作的'rails'方式是在模型中使用活动记录关联

class City < ActiveRecord::Base   
  has_many :neighborhoods
  ....
end

class Neighborhood < ActiveRecord::Base
  belongs_to :city
  ...
end

然后你可以打电话:

neighborhoods = City.find_by(name: "New York").neighborhoods

答案 2 :(得分:0)

如果使用Rails模型,不完全是sql,但结果可能是:

city = City.where(:name =&gt;“New York”)。首先 city.neighborhoods

答案 3 :(得分:0)

您应该尝试使用此代码 -

    City.joins(:neighborhoods).select("neighborhoods.*").where("cities.name = 'New York'")

阐释 -

It will be 'City.joins(:neighbourhoods)' because City has_many neightbours and 'city_id' will work as foreign key for neighbourhood model.

select(“neighborhoods。*”)将从邻域表中选择所有列。

其中(“cities.name ='New York'”)是您的所有记录,其中“城市名称”等于“纽约”。