0

そうです...私はこれを自分でやろうとして3日間費やしました。

Film と Screenings という 2 つのモデルがあります。上映作品は映画に属し、映画には多くの上映作品があります。

映画には特定の属性 (:title、:date_of_release、:description、:genre) があります。

Screening には、属性 (:start_time、:date_being_screened、:film_id (フィルムの外部キー)) があります。

私がやろうとしているのは、これらのモデルの両方に対して検索を作成することです。私はこのようなことをしたい...

@films = Film.advanced_search(params[:genre], params[:title], params[:start_time], params[:date_showing])

そしてフィルムモデルでは...

def self.advanced_search(genre, title, start_time, date)
    search_string = "%" + title + "%"

    self.find(:all, :conditions => ["title LIKE ? OR genre = ? OR start_time LIKE ? OR date_showing = ?", title, genre, start_time, date], order: 'title')
    end
end 

これがこのようにうまくいくとは思いませんが、私の説明が、私が何をしようとしているのかを誰かが理解できるほど詳細であることを願っています?? :-/

助けてくれてありがとう

4

2 に答える 2

0

私は何かを書きたかったのですが、このキャストはすべてhttp://railscasts.com/episodes/111-advanced-search-formと言います

あなたのケースとほぼ同じです。

于 2013-02-27T16:23:38.343 に答える
0

検索機能を別の (ActiveRecordAdvancedSearchではない) クラスに抽出しFilmますScreening

複雑な SQL クエリを記述する代わりに、映画、次に上映を検索し、結果を組み合わせることができます。次に例を示します。

class AdvancedSearch
  def self.search
    film_matches = Film.advanced_search(...) # return an Array of Film objects
    screening_matches = Screening.advanced_search(...) # return an Array of Screening objects

    # combine the results
    results = film_matches + screening_matches.map(&:film)

    results.uniq # may be necessary to remove duplicates
  end
end

アップデート

高度な検索フォームに、ジャンルと場所の 2 つのフィールドがあるとします。したがって、フォームを送信すると、送信されるパラメーターは次のとおりです。

{ :genre => 'Comedy', :location => 'London' }

コントローラーは次のようになります。

def advanced_search(params)
  film_matches = Film.advanced_search(:genre => params[:genre])
  screening_matches = Screening.advanced_search(:location => params[:location])

  # remaining code as above 
end

つまり、パラメータを分割し、それぞれを別のモデルに送信して検索を実行し、結果を結合します。

これは基本的に OR 一致です。ジャンルに一致するか、指定された会場で上映されている映画を返します。(必要に応じて AND 一致する場合は、配列の交点を計算する必要があります)。

于 2013-02-27T14:40:34.697 に答える