ActiveRecord选择除列之外

0xS*_*ina 18 ruby activerecord ruby-on-rails

有没有一种方法可以指定在ActiveRecord中选择所有列,只有少数几个.例如,对于用户,我不想选择他们的密码哈希或他们的电子邮件.这是可能的还是我必须手动硬编码所有列?

谢谢

Mar*_*sen 19

写一个范围就好

def select_without columns
  select(column_names - columns.map(&:to_s))
end
Run Code Online (Sandbox Code Playgroud)

  • 我会做`def select_without*columns`,这样你就可以获取任意数量的参数 (5认同)
  • 这种方法有一个问题:`COUNT` 在这里不起作用。所以,`Model.select([:a,:b]).count` 会抛出错误 (2认同)

Agu*_*ico 8

像这样的东西?

exclude_columns = ['password', 'email']
columns = User.attribute_names.delete_if(|x| exclude_columns.include?(x))

User.select(columns)
Run Code Online (Sandbox Code Playgroud)

编辑

我忘了我们可以做Array1 - Array2

最好的答案:

exclude_columns = ['password', 'email']
columns = User.attribute_names - exclude_columns

User.select(columns)
Run Code Online (Sandbox Code Playgroud)


Dav*_*cia 5

Another really usefull way it's with a scope inside the model in case you need to avoid a column constantly.

In my case I save images into blob fields so I want to avoid those to be loaded everytime and in a easy way:

scope :select_exclude_image, ->  { select( Movie.attribute_names - ['image'] ) }
Run Code Online (Sandbox Code Playgroud)

Then to avoid the image in the selection you can do something like that:

Movie.select_exclude_image.first
Run Code Online (Sandbox Code Playgroud)

or

Movie.select_exclude_image.all
Run Code Online (Sandbox Code Playgroud)

I hope it will help!