如何在rails中查找列值= [给定数组]的记录

时间:2017-02-14 04:33:28

标签: ruby-on-rails postgresql rails-activerecord

设置:Rails + Postgres。

我有表A列

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

对于一行,我需要找到具有相似值的所有行。 在rails中,查询看起来像

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

如果我们没有包含数组类型的列,则此方法有效。 如何查找值= [给定数组]的所有记录?

编辑: 为了清楚起见,我想在where子句中传递多个列,其中某些列是array类型。对于where子句中的值,我传递的是hash(row.attributes.except(* ignore_columns)是一个哈希值)

编辑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的新行。

问题是因为某些列类型是数组类型,所以在where子句中将它们作为哈希/条件传递不起作用。

3 个答案:

答案 0 :(得分:0)

您在rails中的查询如下所示

row = A.find(1)

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

A.where(where_clauses)

答案 1 :(得分: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)

希望有所帮助:)

答案 2 :(得分:0)

将find_by用于find_all_by,它将返回所有匹配的结果。