与a合作的范围有很多关系

时间:2015-12-03 14:14:54

标签: ruby-on-rails ruby model-view-controller activerecord

我有一个用户模型,包含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关系做类似的事情。

2 个答案:

答案 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'