【问题标题】:Ruby on rails 5 show all results depending on related table quantityRuby on rails 5 根据相关表格数量显示所有结果
【发布时间】:2018-06-19 19:23:04
【问题描述】:

我有两种型号,一种是店铺,另一种是地址。一个店铺有很多地址,一个地址属于一个店铺。

我想按名称选择(搜索)并过滤所有与搜索词匹配并为每个地址分隔的商店,例如search param[:name].

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"}
}]

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 我测试你的代码,结果很接近,但我不需要。这家商店出现了 2 -3 次,所以很好,但每个商店都有一组地址,例如。 shopOne 有 2 个地址,下一个对象是相同的,shopOne 有 2 个地址的数组,但我需要如示例中所示,还有其他想法吗?
    • 每个商店都有一个地址,结果显示的地址与它的地址一样多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    相关资源
    最近更新 更多