我正在尝试在 Rails 模型的范围(或 self.func_name)内使用数组函数(特别是“keep_if”和“include?”),但不知道如何使其工作。我认为这是可能的,因为“where”似乎意味着“set.where”,所以“set.keep_if”是有意义的。
我有一个文档表(或者,更确切地说,文档的元数据),其中每个文档在表中都有不同的版本,链接;doc.next_version 和 doc.prior_version。我有一个链接到文档的人员表(通过另一个表“作者”),因此 person.documents 是该人员处理的每个文档的所有版本的列表。我想获取每个人处理的文档的第一个或最后一个版本,而不是 /every/ 版本。
这是我对代码的猜测:
class Document < ActiveRecorrd::Base
has_many :authors
belongs_to :next_version, :class_name => 'Document'
has_one :prior_version, :class_name => 'Document'
#document.document_id is the ID of the prior version of this document
scope :last!, lambda{ keep_if{|d| (d.next_version.nil?)||(! include?(d.next_version))}}
# Keep a doc if it either has no next_version (and is thus the last version in
# the database), or it's next version isn't in this list.
end
class Person < ActiveRecord::Base
has_many :authors
has_many :documents, :through => :authors
end
class Author > ActiveRecord::Base
belongs_to :person
belongs_to :document
end
#Usage Example
documents = Person.find(id).documents.last!
published = documents.keep_if{|d| d.published}
success_rate = published.size / documents.size
# etc
我尝试转换为 a self.first!
,但这没有帮助。(我意识到如果一个人跳过了一个版本的账单,这个方法不会跳过,并且会返回那个文档的两个版本)
我正在寻找更多关于“范围”内发生的事情,以及如何做我想做的事情,即使它使用完全不同的方法。
尽管我自己从纯文本生成元数据,但我几乎可以完全控制一切——所以虽然我可能可以添加新的元数据字段,但我必须完成所有相关的工作。