Ruby on Rails 5根据相关表的数量显示所有结果

时间:2018-06-19 19:23:04

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

我有2个模型,一个是商店,另一个是地址,一个商店有很多地址,并且一个地址属于商店。 我想按名称选择(搜索)并过滤与搜索字词匹配并针对每个地址分开的所有商店,例如 搜索参数[:名称]

def filter_shops
     @shops = Shop.where("name ILIKE CONCAT('%',?,'%')",params[:name])
end

因此,此操作按参数名称搜索所有商店,但我希望如果商店有2或3个地址,则必须在结果中显示2-3次。示例(预期结果):

params[:name] value is "sho"

[{name: "shopOne",
 address: {
     id: 1,
     direction: "av. jojojo 321"}

},{name: "shopOne",
     address: {
           id: 2,
        direction: "onother avenue "}},
 {name: "shopTwo",
     address: {
           id: 7,
           direction: "av. of other shop 333"}
}]

非常感谢

1 个答案:

答案 0 :(得分:1)

您需要JOIN个表:

Shop.joins(:adresses).where("shops.name ILIKE CONCAT('%',?,'%')", params[:name])

更新

如果您需要根据示例创建数组,则可以这样做(为方便起见使用多种方法):

def create_array
  addresses.map do |address|
    {
      name: address.shop.name,
      address: {
        id:        address.id,
        direction: address.direction
      }
    }
  end
end

def addresses
  Address.eager_load(:shop)
         .where("shops.name ILIKE CONCAT('%',?,'%')", params[:name])
         .order(:shop_id)
end