Rails ассоциации с поиском - PullRequest
0 голосов
/ 03 января 2019

У меня есть проблема с ассоциациями с поиском

class Manufacturer < ApplicationRecord

  has_many :translations, class_name: 'ManufacturerTranslation', dependent: :destroy

def self.search(query)
    q = query.to_s.parameterize.gsub('-',' ').split
    joins(:translations).where("lower(name) LIKE ?", "%#{q}%")
end

and 



 class ManufacturerTranslation < ApplicationRecord
  belongs_to :manufacturer
end

, поэтому, когда я попытался выполнить поиск и вызвать переводы на нем

Manufacturer.search('fra').last.translations

, он дает мне только переводы с именем, которое включаетfra, не все переводы

, поэтому у меня есть в общей сложности 6 переводов для этого производителя

, но после поиска вы получите только 2

схема базы данных

 create_table "manufacturer_translations" do |t|
    t.integer "manufacturer_id"
    t.string "locale"
    t.string "name"
    t.string "image_source_url"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["manufacturer_id"], name: "index_manufacturer_translations_on_manufacturer_id"
    t.index ["name"], name: "index_manufacturer_translations_on_name"
  end

  create_table "manufacturers", do |t|
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.boolean "deleted", default: false
  end

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Когда вы разбиваете строку, вы должны перебирать все сущности, чтобы искать их. И вы также должны свести на нет результаты. Попробуйте следующий код:

def self.search(query)
    q          = query.to_s.parameterize.gsub('-',' ').split
    conditions = ''
    q.each do |qu|
      conditions = "#{conditions} OR " if conditions.present?
      conditions = "#{condidtions} lower(manufacturers.name) LIKE %#{qu.downcase}%"
    end

    joins(:translations).where(conditions)
end
0 голосов
/ 03 января 2019

Если вы будете следовать соглашениям Rails, я бы предложил вам заменить это

joins(:translations).where("lower(name) LIKE ?", "%#{q}%")

с

joins(:translations).where("lower(manufacturers.name) LIKE ?", "%#{q}%")

Может понадобиться для игры с цитатами

...