2013-07-24 3 views
2

Я разрабатываю с Rails 3.2.8 Я хочу преобразовать эту сортировку в область Rails.Сортировка по виртуальному атрибуту в Rails

class Doc < ActiveRecord::Base 
    has_many :denotations 

    def same_sourceid_denotations_count 
     denotation_doc_ids = Doc.where(:sourceid => self.sourceid).collect{|doc| doc.id} 
     Denotation.select('doc_id').where('doc_id IN (?)', denotation_doc_ids).size 
    end 
end 

class Denotation < ActiveRecord::Base 
    belongs_to :doc 
end 

анс сортировка, как показано ниже

@docs = docs.sort{|a, b| b.same_sourceid_relations_count <=> a.same_sourceid_relations_count} 

Я написал объем ниже, но не работает.

scope :same_sourceid_docs_denotations_count 
    select('docs.*, docs.sourceid = docs.sourceid AS same_sourceid_doc_ids, COUNT(denotations.doc_id IN (same_sourceid_doc_ids)) AS same_sourceid_docs_denotations_count') 
    .group('docs.id') 
    .order('same_sourceid_docs_denotations_count DESC') 

У вас есть ошибка.

PG::Error: ERROR: missing FROM-clause entry for table "denotations" 
LINE 1: ...d = docs.sourceid AS same_sourceid_doc_ids, COUNT(denotation... 
                 ^
: SELECT docs.*, docs.sourceid = docs.sourceid AS same_sourceid_doc_ids, COUNT(denotations.doc_id IN (same_sourceid_doc_ids)) AS same_sourceid_docs_denotations_count FROM "docs" WHERE "docs"."sourcedb" = 'PubMed' GROUP BY docs.id ORDER BY same_sourceid_docs_denotations_count DESC LIMIT 10 OFFSET 0 
     .group('docs.id') 
     .order('same_sourceid_docs_denotations_count DESC') 

Этот шаг сортировки ниже

  • Найти все документы, которые имеет тот же SourceId и получить эти идентификаторы.
  • Обозначения графы, которые имеют doc_id в идентификаторах выше.
  • Сортировка документов по количеству обозначений выше.

    < Док ID: 1, SourceId: 111 >
    < Doc ID: 2, SourceId: 111 >
    < Обозначение ID: 1, DOC_ID: 1 >
    < Обозначение ID: 2, DOC_ID: 2 >
    < Обозначение ID: 3, DOC_ID: 2 >
    => кол денотаций, связанных с SourceId 111 должно быть 3

    < Док ID: 3, SourceId: 222 >
    < обозначении ID: 4, DOC_ID: 3 >
    => кол денотаций, связанных с SourceId 222 должно быть 1

Любые идеи?

ответ

1

Похоже, вам не хватает статьи JOIN, чтобы внести в таблицу denotations. Попробуйте что-то вроде этого (обратив внимание на использование joins(...)):

scope :same_sourceid_docs_denotations_count, 
    select("docs.*, count(denotations.id) AS denotations_count") 
    .joins("INNER JOIN denotations ON denotations.sourceid = docs.sourceid") 
    .group("docs.id") 
    .order("denotations_count DESC") 

ActiveRecord Query Interface руководство также имеет некоторые хорошие детали о том, как использовать joins(...).

+0

Спасибо за ваш ответ :) На самом деле, количество обозначений - это все обозначения, которые имеют doc_id в docs.id, которые имеют одинаковый исходный код. Обратитесь к шагу сортировки, который я добавил. – DIGITALSQUAD

Смежные вопросы