Вложенный AREL и / или запрос в Rails - PullRequest
0 голосов
/ 30 апреля 2020

Я уверен, что это будет просто для тех, кто знает, что они делают. Я хочу написать это утверждение как область видимости - и я бы предпочел использовать формат Arel, но не могу определить OR внутри AND

select * from contacts where contact_type in (1,2) and 
((contactable_type = 'Developer' and contactable_id = 10) or (contactable_type = 'Development' and contactable_id = 24))

, поэтому для начала моей области видимости - первый бит прост

scope :of_type,
        lambda { |types|
            where(contact_type: types)
        }

но я не могу получить это И с вложенными ИЛИ. Я, очевидно, вышлю необходимые мне идентификаторы

scope :of_type,
        lambda { |types, developer_id, development_id |
            where(contact_type: types) .. .
        }

1 Ответ

0 голосов
/ 30 апреля 2020

Это подход Arel:

Contact.select(Arel.star).where(
  Contact.arel_table[:contact_type].in([1, 2]).and(
    Contact.arel_table[:contactable_type].eq('Developer').and(Contact.arel_table[:contactable_id].eq(10)).or(
      Contact.arel_table[:contactable_type].eq('Development').and(Contact.arel_table[:contactable_id].eq(24))
    )
  )
)

Это вариант Active Record:

contacts = Contact.where(contact_type: [1, 2])
contacts.where(contactable_type: 'Developer', contactable_id: 10).or(contacts.where(contactable_type: 'Development', contactable_id: 24))

Если вы сможете использовать последний, было бы лучше ты ИМХО.

...