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