我有一个用户模型,包含has_many文档和属于用户的Document模型,如下所示:
class User < ActiveRecord::Base
has_many :documents, dependent: :destroy
end
class Document < ActiveRecord::Base
belongs_to :user
end
我在名为boolean
的文档上有一个archived
字段。我可以通过以下方式访问属于用户的所有文档:
@user = User.first
@user.documents
。
但我想要做的是在User模型上创建一个范围,以显示属于该用户的所有文档,并使其归档值为true。我可以使用模型方法,但我想弄清楚如何范围它。类似scope, -> {documents.where(archived: true)}
的内容。如何用has_many关系做类似的事情。
答案 0 :(得分:1)
ActiveRecord范围的最佳特质之一是它们彼此构成,并与人际关系构成。像这样在Document中添加这个范围:
class Document
scope :archived { where(archived: true) }
end
然后此代码将按预期运行:
@user = User.first
@user.documents.archived
随着您的范围变得更加复杂,您需要注意的另一项技术是,您可以在频繁访问的位置为它们创建速记。
class User
def archived_documents
documents.archived
end
end
答案 1 :(得分:0)
为了回答我自己的问题,您还可以使用与{where}子句的has_many
关系。这在用户模型中:
has_many archived_documents, -> { where(archived: true) }, class_name: 'Document'