ActiveRecord选择除列之外

时间:2013-07-02 16:36:42

标签: ruby-on-rails ruby activerecord

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

由于

5 个答案:

答案 0 :(得分:17)

写一个像

这样的范围
def select_without columns
  select(column_names - columns.map(&:to_s))
end

答案 1 :(得分:8)

这样的东西?

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)

答案 2 :(得分:1)

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

在我的情况下,我将图像保存到Blob字段中,所以我希望避免每次都以简单的方式加载这些图像:

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

然后要避免选择图像,您可以执行以下操作:

Movie.select_exclude_image.first

Movie.select_exclude_image.all

我希望它将对您有帮助!

答案 3 :(得分:1)

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

代码非常简单:

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

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

答案 4 :(得分:0)

在某些情况下,尤其是当您考虑将default_scope排除在某些列之外时,我建议您不要使用此方法,因为enter image description here与Rails有关count在{ {1}}子句。这可能会导致意外的下游错误。

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