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
に変換してみましたself.first!
が、役に立ちませんでした。(人が請求書のバージョンをスキップした場合、このメソッドはスキップせず、そのドキュメントの2つのバージョンを返すことを理解しています)
私は、「スコープ」内で何が起こっているのか、そしてそれが完全に異なる方法を使用しているとしても、私がやろうとしていることをどのように行うのかをもっと知りたいと思っています。
プレーンテキストからメタデータを自分で生成していますが、ほとんどすべてを完全に制御できます。したがって、新しいメタデータフィールドを追加することはできますが、それに伴うすべての作業を行う必要があります。