我正在创建一个搜索页面,该页面将返回来自两个模型AHotel
和BHotel
的结果。我想通过相同的参数查询两个表-即,我希望所有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"}]
答案 0 :(得分:0)
如果您正在使用STI(Single Table Inheritance)将Hotel
表扩展为类型化的类AHotel
和BHotel
,则可以直接查询Hotel
表:Hotel.where("citiy ILIKE :search", search: 'New York').order(:type, ...)
。结果中将同时返回AHotel和BHotel。
如果您的数据库中实际上有两个物理表,则您可能希望使用STI作为更好的设计架构,以启用这种查询。