我想在Rails模型的作用域(或self.func_name)中使用數組函數(特別是「keep_if」和「include?」),但不知道如何使其工作。我認爲這是可能的,因爲它看起來像一個「在哪裏」意味着「set.where」,所以「set.keep_if」將是有意義的。在Rails模型作用域定義中使用數組函數
我有一張文檔(或者說,文檔的元數據),其中每個文檔在表中有不同的版本,鏈接; doc.next_version和doc.prior_version。我有一個人的表格鏈接到文檔(通過另一個表,「作者」),所以person.documents是該人員工作的每個文檔的所有版本的列表。我想獲取每個人工作的文檔的第一個或最後一個版本,而不是/每個版本。
這是我的猜測,代碼:
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
我試圖轉換爲self.first!
,但這並沒有幫助。 (我意識到,如果一個人跳過賬單的一個版本,這種方法不會跳過,並且會返回該文檔的兩個版本)
我期待着瞭解更多「範圍內發生了什麼「,以及如何做我想做的事情,即使它使用了完全不同的方法。
雖然我從純文本自己生成元數據,但我可以添加新的元數據字段,但我必須完成所有需要的工作。
看來我的猜測是關於範圍工作是如何完全關閉的 - 他們被命名爲查詢片段,所以我需要制定一些查詢來做我想做的事情。 – Narfanator