ПРИСОЕДИНИТЬСЯ Query ruby ​​на рельсах - PullRequest
0 голосов
/ 02 мая 2018

у меня 3 модели: * Техник * Договор подряда * WorkContractType

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

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

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
}

и последний WorkContract:

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, я думаю, что есть проблема с условием соединения, и я подумал, что если я перезапишу запрос с левой присоединиться или что-то, что возвращает все данные, даже если ноль поможет! обратите внимание, что:

Пользователь: has_many: work_contracts, -> {order 'start_on DESC'} и has_many: work_contract_types, через:: work_contracts

WorkContract: Proper_to: пользователь и Proper_to: Work_contract_type

1 Ответ

0 голосов
/ 02 мая 2018

Вы можете использовать левое внешнее объединение, по умолчанию 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(
...