0

一个联系人有一个分配给他们的用户:

class Contact < ActiveRecord::Base
    ...
    belongs_to :user
    ...
end

用户模型有一个字段,我想在任何时候从数据库返回一个或多个用户对象时排除。使其工作的方法之一是添加默认范围:

class User < ActiveRecord::Base
    ...
    has_many :contacts
    ...

    default_scope select((column_names - ['encrypted_password']).map { |column_name| "`#{table_name}`.`#{column_name}`"})
end

所以在控制台中,如果我这样做:

User.first

选择语句和结果集不包括“encrypted_pa​​ssword”。

但是,如果我这样做:

c = Contact.includes(:user).first

c.user

他们是这样。在这种情况下,不会应用 User 模型的默认范围,并显示“encrypted_pa​​ssword”字段。

所以我的问题是为什么?此外,是否有一种干净的方法来指定应在相关对象上返回哪些字段?

4

1 回答 1

1

您应该能够在 belongs_to 关系上使用 :select 选项。像这样的东西:

class Contact < ActiveRecord::Base
  ...
  belongs_to :user, :select => [:id, :first_name, :last_name, :email]
  ...
end
于 2012-07-06T03:54:43.673 回答