2017-02-14 2 views
3

Настройка: Rails + Postgres.Как найти записи, где значение столбца = [заданный массив] в рельсах

У меня таблицу А с колоннами

id: int, name: string, address: string, s_array: varchar[], i_array: int[], created_at: datetime) 

для строки, мне нужно, чтобы найти все строки, которые имеют одинаковые значения. В рельсах, то запрос будет выглядеть

row = A.find(1) # any random row 
ignore_columns = %w[id created_at] 
A.where(row.attributes.except(*ignore_columns)) 

Это работает, если мы не имеем столбца с типом массива. Как найти все записи, где значение = [данный массив]?

Редактировать: Чтобы быть ясным, я хочу передать несколько столбцов в where, где некоторые столбцы имеют тип массива. Для значений в ИНЕКЕ, я передаю хэш (row.attributes.except (* ignore_columns) является хэш)

Edit 2: Пример:

Допустим, у меня есть таблица запросов

Query(id: Int, name: String, terms: varchar[], filters: int[], city: string, created_at: datetime) 

id = primary key/integer 
terms = array of string 
filters = array of integer (it is an enum and we can select multiple which is saved as array) 
other fields = self explanatory 

Пусть я следующие строки

(1, "query1", ["john"], [0], "wall", <some_date>) 
(1, "query2", ["eddard", "arya"], [0, 1], "Winterfell", <some_date>) 
(1, "query3", ["sansa", "arya"], [1, 2], "Winterfell", <some_date>) 

Теперь, когда я добавить новую строку

row = ActiveRecord of (1, "query4", ["eddard", "arya"], [0, 1], "Winterfell", <some_date>) 

Что я хочу искать уже существующие записи, как этот

ignore_attributes = %w[id name created_at] 
Query.where(row.attributes.except(*ignore_attributes)) 

Этот запрос должен возвращать уже существующий query3, так что мне не нужно, чтобы добавить новую строку с именем query4.

Проблема в том, что некоторые типы столбцов имеют тип массива, а затем передают их как хэш/условия в том, что предложение не работает.

+0

какие столбцы вам нужно игнорировать, прежде чем вы проверите и удалите запрос вставки.? – Milind

+0

Те, что указаны в массиве ignore_attributes. – chinmayv

ответ

0

Ваш запрос в рельсах выглядеть ниже

row = A.find(1) 

where_clauses = row.attributes.reject{|k,v| %[id, created_at].include?(k)} 

A.where(where_clauses) 
+0

Не получил то, что вы пытаетесь сказать. То, что вы написали выше, такое же, как и мой вопрос. – chinmayv

0

Попробуйте этот пример: -

##black list of attributes 
    ignore_attributes = %w[id name created_at] 

    MyModel.where(active: true).select(MyModel.attribute_names - ignore_attributes) 

    =====The above query can also be chained as:- ===== 

    ##you have a city column too 
    MyModel.where(active: true).select(MyModel.attribute_names - ignore_attributes).where.not(:city=>["Sydney","London"]) 

Если вам это нужно постоянное исправление, вы можете добавить эту строку в файл model.rb. , но его опасно.

self.ignored_columns = %w(id name created_at) 

Надеется, что это помогает :)

+0

Спасибо, но я не хочу, чтобы найти по одному столбцу, я хочу передать хеш из нескольких значений в where clause (уточнено то же самое) – chinmayv

+0

Можете ли вы поделиться каким-либо примером ... попытаетесь помочь вам?) – Milind

+0

Добавленный пример в вопросе @milind – chinmayv

0

использования find_by для find_all_by и он будет возвращать все соответствующие результаты.

Смежные вопросы