У меня 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
Вы можете использовать левое внешнее соединение, по умолчанию 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(
Если вам нужен "work_contract_type", это может быть дополнительное соединение: joins("LEFT OUTER JOIN work_contract_type ON work_contract.work_contract_type_id = work_contract_type.id")
Также было бы здорово узнать об ошибке для анализа. А почему вы описываете класс User, а запрос - техник?
поскольку технический специалист унаследован от пользователя, а пользователь связан с WorkContractType, думал WorkContract
Обновлен ответ для ваших многих ко многим. Надеюсь, что нет конфликтов по поводу table_name для класса Technician, или вы явно задаете table_name.
Привет, Александр, спасибо за ваш ответ, это не работает, возможно, вам нужно увидеть отношения моделей, чтобы понять больше