有没有一种方法可以指定选择 ActiveRecord 中的所有列,除了少数。例如,对于用户,我不想选择他们的密码哈希或电子邮件。这是可能的还是我必须手动硬编码所有列?
谢谢
有没有一种方法可以指定选择 ActiveRecord 中的所有列,除了少数。例如,对于用户,我不想选择他们的密码哈希或电子邮件。这是可能的还是我必须手动硬编码所有列?
谢谢
写一个范围
def select_without columns
select(column_names - columns.map(&:to_s))
end
像这样的东西?
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)
另一种非常有用的方法是在模型内部使用范围,以防您需要不断避免列。
就我而言,我将图像保存到 blob 字段中,因此我想避免每次都以简单的方式加载这些图像:
scope :select_exclude_image, -> { select( Movie.attribute_names - ['image'] ) }
然后为了避免选择中的图像,您可以执行以下操作:
Movie.select_exclude_image.first
或者
Movie.select_exclude_image.all
我希望它会有所帮助!
只需为希望在每个查询中默认排除某些列的人添加一个选项,就可以使用 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
因此它可能仅适用于从不需要使用列的情况。
在某些情况下,特别是当您考虑default_scope
排除某些列时,我建议您不要使用这种方法,因为Rails 存在一个关于在子句后中断的已知问题。这可能会导致令人惊讶的下游错误。count
select
在这种情况下,请考虑将您的记录分成两张表,一张包含基本数据,另一张包含您不时需要的数据,然后使用关联来访问额外数据。