如何在数据库中搜索可保存在联结中的特定M对N关系

时间:2018-09-24 03:35:14

标签: sql ruby-on-rails postgresql

我在Rails应用程序上使用了一个postgreSQL数据库。我在<ul class="scroll-nav-x scroll-tabs-x tabs clearfix"> <li class="active" rel="tab1">All</li> <li rel="tab2">Others</li> </ul> <div class="tab-container large"> <div id="tab1" class="tab-content" style="display: block;"> <div class="row"> Dummy </div> </div> </div>Slots之间建立了m对n的关系。我需要做的最后一件事是找到与Hashtags

给定的特定Slots匹配的Hashtags

这是schema.rb

url params

我想显示由 create_table "hashtags", force: :cascade do |t| t.string "value" t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "hashtags_slots", id: false, force: :cascade do |t| t.bigint "hashtag_id", null: false t.bigint "slot_id", null: false t.index ["hashtag_id"], name: "index_hashtags_slots_on_hashtag_id" t.index ["slot_id"], name: "index_hashtags_slots_on_slot_id" end create_table "slots", force: :cascade do |t| t.string "slot_name" t.string "file_path" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["slot_name"], name: "index_slots_on_slot_name" end 填充的插槽的索引,这些索引具有通过slots给出的主题标签之一。 Hashtags的值可以包含1个或多个字符串,如下所示:

params[:hashtags]

这是在hashtags = "NetEnt PlayNGo Novomatic" 控制器的index动作中

Slot

一种方法应该如何

if(params[:slot_name])
      @slots = Slot.where(slot_name: params[:slot_name]).paginate(page: params[:page])
    elsif(params[:hashtags])
      @slots = slotsWithAtLeastOneOfThose(params[:hashtags])
    else
      @slots = Slot.all.paginate(page: params[:page])
    end

给我所有slotsWithAtLeastOneOfThose(hashtags) slots = ... return slots end 变量中至少有一个Slots的{​​{1}}

考虑那些关系:

插槽表

hashtag

标签表:

hashtags

Hashtags_Slots表如下所示:

 id: 1 slot_name: Book of Dead
 id: 2 slot_name: Big Win Cat
 id: 3 slot_name: Big Bad Wolf

现在是方法

 id: 1 value: PlayNGo
 id: 2 value: Fun
 id: 3 value: NetEnt
 id: 4 value: MicroGaming
 id: 5 value: NotFun

应该给我所有slot_id hashtag_id 1 1 1 2 2 2 2 3 2 5 3 4 3 5 和#slotsWithAtLeastOneOfThose("PlayNGo NetEnt") Slots

在这种情况下

PlayNGo

1 个答案:

答案 0 :(得分:0)

请检查以下查询以获取具有特定哈希标签值的广告位

if(params[:slot_name])
   @slots = Slot.where(slot_name: params[:slot_name]).paginate(page: params[:page])
elsif(params[:hashtags])
   @slots = Slot.joins(:hashtags).where("hashtags.value LIKE ?", "%#{params[:hashtags]}%")
else
   @slots = Slot.all.paginate(page: params[:page])
end