ПРИСОЕДИНЯЙТЕСЬ Query ruby ​​on rails

У меня 3 модели: * Техник * Договор работы * WorkContractType

Я хочу закодировать помощника, который выполняет поисковый запрос в базу данных и возвращает все данные, даже если общий столбец между двумя объединенными таблицами равен нулю, помощник используется на другой стороне проекта, и он работает очень хорошо, когда я сделай поиск

вот модель пользователя:

class User < ActiveRecord::Base {
                      :id => :uuid,
                   :email => :string,
      :encrypted_password => :string,
    :reset_password_token => :string,
  :reset_password_sent_at => :datetime,
     :remember_created_at => :datetime,
           :sign_in_count => :integer,
      :current_sign_in_at => :datetime,
         :last_sign_in_at => :datetime,
      :current_sign_in_ip => :string,
         :last_sign_in_ip => :string,
      :confirmation_token => :string,
            :confirmed_at => :datetime,
    :confirmation_sent_at => :datetime,
       :unconfirmed_email => :string,
    :authentication_token => :string,
                    :type => :string,
              :company_id => :uuid,
                 :team_id => :uuid,
      :weekly_schedule_id => :uuid,
              :first_name => :string,
               :last_name => :string,
                  :avatar => :string,
                :username => :string,
                  :gender => :integer,
      :invitation_sent_at => :datetime,
             :birthday_on => :date,
             :is_archived => :boolean,
           :updated_by_id => :uuid,
               :device_id => :string,
             :import_keys => :hstore,
              :created_at => :datetime,
              :updated_at => :datetime,
            :is_localized => :boolean,
        :is_administrator => :boolean,
                :store_id => :uuid,
                    :code => :string,
   :current_session_token => :string
}

и вот модель WorkContractType:

class WorkContractType < ActiveRecord::Base {
             :id => :uuid,
           :name => :string,
           :slug => :string,
    :is_archived => :boolean,
  :updated_by_id => :uuid,
      :device_id => :string,
     :created_at => :datetime,
     :updated_at => :datetime
}

и последний рабочий контракт:

class WorkContract < ActiveRecord::Base {
                     :id => :uuid,
                :user_id => :uuid,
  :work_contract_type_id => :uuid,
               :start_on => :date,
                 :end_on => :date,
            :is_archived => :boolean,
          :updated_by_id => :uuid,
              :device_id => :string,
            :import_keys => :hstore,
             :created_at => :datetime,
             :updated_at => :datetime,
     :rubric_category_id => :uuid
}

Я вызываю свою вспомогательную функцию:

    class TechnicianQueryHelper

  def initialize( query = nil )
    @query = Arel.sql("UNACCENT('%#{ query }%')")
  end

  def search
    Technician.joins(:work_contract_types).where(
      first_name.matches( @query )
        .or( last_name.matches( @query ) )
        .or( email.matches( @query ) )
        .or( technician_code.matches( @query ) )
        .or( work_contract_name.matches( @query ) )
    )
  end

когда я пытаюсь найти техника, который не работает, и когда я удалил условие соединения, он работает, но не в другом vue, я думаю, что есть проблема с условием соединения, и я подумал, что если я перепишу запрос с левым соединением или каким-либо вещь, которая возвращает все данные, даже если nil поможет! Обратите внимание, что :

User : has_many :work_contracts, -> { order 'start_on DESC' } and has_many :work_contract_types, through: :work_contracts

WorkContract : belongs_to :user and belongs_to :work_contract_type

Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
0
0
75
1

Ответы 1

Вы можете использовать левое внешнее соединение, по умолчанию includes делает трюк, но он переименовывает столбец. Поэтому я предлагаю попробовать includes вместо join. Если не поможет, попробуйте:

 Technician.joins("LEFT OUTER JOIN work_contracts ON work_contracts.user_id = users.id").joins("LEFT OUTER JOIN work_contract_types ON work_contracts.work_contract_type_id = work_contract_types.id").where(

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

user9569059 02.05.2018 17:56

Если вам нужен "work_contract_type", это может быть дополнительное соединение: joins("LEFT OUTER JOIN work_contract_type ON work_contract.work_contract_type_id = work_contract_type.id") Также было бы здорово узнать об ошибке для анализа. А почему вы описываете класс User, а запрос - техник?

Alexander Sysuiev 02.05.2018 18:30

поскольку технический специалист унаследован от пользователя, а пользователь связан с WorkContractType, думал WorkContract

user9569059 02.05.2018 18:38

Обновлен ответ для ваших многих ко многим. Надеюсь, что нет конфликтов по поводу table_name для класса Technician, или вы явно задаете table_name.

Alexander Sysuiev 02.05.2018 19:49

Другие вопросы по теме