Задать вопрос
@snowsem
PHP/RUBY Разработчик

Как переписать запрос в ORM Ruby on Rails?

Всем привет! Помогите со связями в моделях
Есть 3 таблицы: Clients, Contacts, Calls
В таблице Calls есть и ClinetId и ContactId
Есть запрос

SELECT `calls`.* 
FROM `calls` WHERE `calls`.`CallContragent` = '130350' 
OR `calls`.`CallContact` 
IN ('74031', '74032', '74214', '74221', '74222', '74243', '74256', '74273', '74293', '74294', '74296', '74323', '74327', '74535', '74536')


Запрос выводит правильно как сделать связь в модели

1 Если я делаю has_many :calls, class_name: 'Call', primary_key: 'ClientId',foreign_key: 'CallContragent' - То выводит только звонки по CallContragent

2 Если я сделаю вот так has_many :calls, class_name: 'Call', primary_key: 'ClientId',foreign_key: 'CallContragent', through: :contacts - то выводит звонки по CallContact и не выводит связь с CallConragent
Как сделать чтоб выводил и по CallContragent и CallContact
bab2da039404416dabc17ff9cda2084f.jpgee4812fb22964029b193e46beec27522.jpg
Отблагодарю чем смогу!
  • Вопрос задан
  • 436 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 2
@vsuhachev
для вашего запроса не нужны связи, вот ка-то так
Call.where('CallContragent' => 123).or.where('CallContact' => [123, 123, 123]) # rails 5
Call.where('CallContragent = ? OR CallContact IN ?', 123, [123, 123, 123]) # rails 4


А вообще в модели Call судя по всему должно быть
belongs_to :client
belongs_to :contact


А в Client
has_many :calls
has_many :contacts, through: :calls


В Contact - что-то аналогичное тому что с Client, только для вызовов и клиентов
Ответ написан
@snowsem Автор вопроса
PHP/RUBY Разработчик
class ClientCardController < ApplicationController
  before_action :get_id, only: [:index]
  def index
  end
  def get_id
    @client = Client.includes(:bills => [:bill_status]).find(params[:id])
    @calls = Call.includes(:call_status, :contact).where(
        'CallContragent = ? OR CallContact IN (?)',
        params[:id],
        Contact.select(:IDContact).where(:IDContragent=> params[:id]))
  end

end

Вот мое решение
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы