21

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

谢谢

4

5 回答 5

20

写一个范围

def select_without columns
  select(column_names - columns.map(&:to_s))
end
于 2013-07-02T16:44:05.813 回答
12

像这样的东西?

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

User.select(columns)

编辑

我忘了我们可以做Array1 - Array2

最佳答案:

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

User.select(columns)
于 2013-07-02T16:41:59.707 回答
5

另一种非常有用的方法是在模型内部使用范围,以防您需要不断避免列。

就我而言,我将图像保存到 blob 字段中,因此我想避免每次都以简单的方式加载这些图像:

scope :select_exclude_image, ->  { select( Movie.attribute_names - ['image'] ) }

然后为了避免选择中的图像,您可以执行以下操作:

Movie.select_exclude_image.first

或者

Movie.select_exclude_image.all

我希望它会有所帮助!

于 2018-08-30T17:13:41.643 回答
1

只需为希望在每个查询中默认排除某些列的人添加一个选项,就可以使用 Rails 5 功能ignored_columns,顾名思义,该功能将这些排除在外。

代码非常简单:

class User < ApplicationRecord
  self.ignored_columns = %w[password email]
end

请注意,ignore_columns 文档指出,You will get an error if accessing that attribute directly, so ensure all usages of the column are removed因此它可能仅适用于从不需要使用列的情况。

于 2021-01-11T16:53:31.477 回答
0

在某些情况下,特别是当您考虑default_scope排除某些列时,我建议您不要使用这种方法,因为Rails 存在一个关于在子句后中断的已知问题。这可能会导致令人惊讶的下游错误。countselect

在这种情况下,请考虑将您的记录分成两张表,一张包含基本数据,另一张包含您不时需要的数据,然后使用关联来访问额外数据。

于 2020-01-14T12:46:31.747 回答