从两个表按相同条件查询

时间:2019-06-25 17:13:12

标签: ruby-on-rails postgresql

我正在创建一个搜索页面,该页面将返回来自两个模型AHotelBHotel的结果。我想通过相同的参数查询两个表-即,我希望所有AHotels和所有BHotels都具有城市属性,例如“ New York”。

我的搜索页应始终在AHotels之前显示BHotels。我想要一个返回的数组,其中所有在纽约的AHotels,然后是纽约的BHotels

AHotel.where("city ILIKE ?", "%#{city}%").or(BHotel.where("city ILIKE ?", "%#{city}%"))

AHotel.includes(:bhotel).where("ahotels.city ILIKE :search OR bhotels.city ILIKE :search", search: "new york").references(:bhotels)

当我跑步时 Hotel.where("city ILIKE ?", "New York").count,我得到了37。

当我跑步时 BHotel.where("city ILIKE ?", "New York").count,我得到600。

但是当我运行前两个查询中的任何一个时,我只能得到37。它似乎仅返回AHotels

如何按城市从两个表中查询?我不想运行两个单独的查询,因为我要对结果进行分页。

AHotel记录示例

{"id" => 1, "name"=>"Hyatt Place", "address"=>"Cox Rd", "state"=>"VA", "city"=>"nyc", "country"=>"US"} 


{"id" => 2, "name"=>"Hyatt Place", "address"=>"Cox Rd", "state"=>"VA", "city"=>"la", "country"=>"US"}

BHotel记录示例

{"id" => 1, "prop_name"=>"Marriott", "address"=>"Cox Rd", "state"=>"VA", "city"=>"nyc", "country"=>"US"}

{"id" => 2, "prop_name"=>"Hilton", "address"=>"Cox Rd", "state"=>"VA", "city"=>"denver", "country"=>"US"}

我想要返回的内容

ID为1的AHotel和ID = 2的BHotel的数组,因为它们的城市都设置为nyc。

[{"id" => 1, "name"=>"Hyatt Place", "address"=>"Cox Rd", "state"=>"VA", "city"=>"nyc", "country"=>"US"}, {"id" => 1, "prop_name"=>"Marriott", "address"=>"Cox Rd", "state"=>"VA", "city"=>"nyc", "country"=>"US"}]

1 个答案:

答案 0 :(得分:0)

如果您正在使用STI(Single Table Inheritance)将Hotel表扩展为类型化的类AHotelBHotel,则可以直接查询Hotel表:Hotel.where("citiy ILIKE :search", search: 'New York').order(:type, ...)。结果中将同时返回AHotel和BHotel。

如果您的数据库中实际上有两个物理表,则您可能希望使用STI作为更好的设计架构,以启用这种查询。