Как искать в моей БД конкретные m-n-отношения, сохраненные в объединяемой таблице - PullRequest
0 голосов
/ 24 сентября 2018

Я использую базу данных postgreSQL в своем приложении Rails.Я установил m-to-n отношения между Slots и Hashtags.Последнее, что мне нужно, это найти Slots, которые соответствуют конкретным Hashtags, указанным для url params

Вот схема.rb

  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, которые имеют один из хэштегов, который дается через params[:hashtags].Значение Hashtags может содержать 1 или более строк, например:

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, которые имеют хотя бы один hashtag в переменной hashtags

Рассмотрим эти отношения:

Таблица слотов :

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

Таблица Hashtag:

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

Таблица Hashtags_Slots будет выглядеть так:

slot_id            hashtag_id
1                  1
1                  2
2                  2
2                  3
2                  5
3                  4
3                  5

А теперь метод

slotsWithAtLeastOneOfThose("PlayNGo NetEnt")

должен дать мне все Slots с хэштегом PlayNGo и NetEnt

В данном случае

 id: 1 slot_name: Book of Dead
 id: 2 slot_name: Big Win Cat

1 Ответ

0 голосов
/ 24 сентября 2018

Пожалуйста, проверьте ниже запрос для получения слотов с определенным значением хэш-тега

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...