2016-06-14 2 views
0

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

Я нашел решение петли через все столбцы модели:

user.columns.each do |column| 

Но как я мог указать только определенные столбцы?

ответ

0

Вы можете использовать метод как .find_all для фильтрации, например, по имени:

User.columns.find_all { |column| ['name', 'created_at'].include? column.name }.each do |column| 
1

Взгляните на метод, который вы нашли, на примере класса:

> Post.columns.last 
=> #<ActiveRecord::ConnectionAdapters::PostgreSQLColumn:0x007feee6bc2320 
@array=false, 
@cast_type= 
    #<ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer:0x007feee6bd36c0 
    @limit=nil, 
    @precision=nil, 
    @range=-2147483648...2147483648, 
    @scale=nil>, 
@default="1", 
@default_function=nil, 
@name="max_likes", 
@null=false, 
@sql_type="integer"> 

Скажем, есть 12 сообщений.

> Post.count 
=> 12 

Все значения на columns доступны и могут быть использованы для ограничения результатов.

> Post.columns.count { |c| c.name == 'max_likes' } 
=> 1 
> Post.columns.count { |c| c.sql_type == 'integer' } 
=> 5 
> Post.columns.count { |c| c.precision == nil } 
=> 12 
> Post.columns.count { |c| c.default == "1" } 
=> 2 

После того, как вы фильтруется, вы можете делать все, что вам нужно с выбранной колонки:

> Post.columns.select { |c| c.name == 'max_likes' }.each do |c| 
    puts c.sql_type 
    end 
=> integer