2016-11-19 5 views
1

私はちょうど適切なものを検索していないかどうかはわかりませんが、選択ボックスのコレクションとして使用するスコープを設定するために探しています。ActiveRecordスコープネストしたオブジェクト

ノートブックモデル:

class Notebook < ActiveRecord::Base 
    has_many :notes 
end 

注モデル:

class Note < ActiveRecord::Base 
    belongs_to :notebook 
end 

私は(このため)重要な属性はnote_typeされ、ノート上のいくつかの属性を持っています。今のところ、note_typeはcheck_list,text、またはbookmarkとなります。

範囲に
Notebooks.notes_without_check_lists 

がダウンので、ユーザーはだけ選択ドロップダウンノートブックからnote_typecheck_listで任意のnotesが含まれていないことができます。

私の目標は、この作業のようなものを持っていることです。私は各noteの反復処理をどこで行うべきかわからないので、親の有無を判断するにはnotebookをコレクションに含めることができます。

EDIT
現在、私は4つのNotebookレコードを持っています。 4つのレコードのうち、メモタイプがcheck_listのノートが1つだけ含まれています。そのノートには合計2つのノートが含まれていますが、そのうちの1つのノートタイプはcheck_listです。これは事実だから、ノートブックの他のノートとは関係なく、そのノートブック全体をスコープから除外したいと思います。

ご協力いただければ幸いです。

答えて

0

使用scope

class Notebook < ActiveRecord::Base 
    has_many :notes 
    scope :notes_without_check_lists, -> { joins(:notes).where.not(notes: { note_type: 'check_list' }).group('notebooks.id') } 
end 

基本的にはnote_typecheck_listと等しくないすべてのノートPCノートを引っ張って、データベースクエリを実行します。

EDIT

あなたは質問を編集した後、ここにルビー(プロセスへnotebooks/notesの大コレクションと非効率的な)を使用したソリューションがある - まだActiveRecordのでそれを解決について考えます:

class Notebook < ActiveRecord::Base 
    has_many :notes 

    def self.notes_without_check_lists 
    all.reject { |notebook| notebook.notes.any? { |note| note.note_type == 'check_list' } } 
    end 
end 
+0

私はこれは本当に近いと思います。しかし、私は実際にこれを使ってデータベースにある合計より多くのレコードを取得しています。たとえば、合計4つのノートブックオブジェクトがあり、そのうち1つにチェックリスト付きメモが実際に含まれています。これにより、4つのレコードすべてと、3番目のレコードのコピーが返されます。私はもう少し調査をしていますが、少なくともこのコードのどこかで私を得ることに感謝したいと思います。 – gr8

+0

'joins(:notes).where(notes:{note_type: 'check_list'})'を使用すると、チェックリストを含む1つのレコードが返されます。 – gr8

+0

@ jeepagooster私は答えを編集しました、 'group'の部分に注意してください。その答えを受け入れることを確認したら(回答スコアの近くのチェックマークを探してください) –

関連する問題