Ruby on Rails搜索2个模型

时间:2013-02-27 14:21:32

标签: ruby-on-rails ruby search models

是的......我已经花了3天的时间尝试自己做这件事而不是谷歌。

我有两个名为电影和放映的模特。放映属于电影,电影has_many放映。

电影有某些属性(:title,:date_of_release,:description,:genre)。

屏幕具有属性(: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 

我不认为这可能会像这样工作,但我希望我的解释足够详细,任何人都可以理解我在做什么? : - /

感谢任何帮助人员

2 个答案:

答案 0 :(得分:0)

我会将搜索功能提取到单独的(非ActiveRecord)类中,例如AdvancedSearch,因为它不能完全适合FilmScreening类。< / p>

您可以只搜索电影,然后搜索电影,然后合并结果,而不是编写复杂的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

更新

假设您的高级搜索表单有两个字段 - 流派和位置。因此,当您提交表单时,发送的参数是:

{ :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

即。你要拆分params,将每个模型发送到不同的模型来运行搜索,然后将结果组合起来。

这实际上是一场OR比赛 - 它将返回与该类型相匹配或正在该指定场地进行筛选的电影。 (如果你想和AND匹配,你需要完成数组交集。)

答案 1 :(得分:0)

我想写点什么,但这个演员表示所有http://railscasts.com/episodes/111-advanced-search-form

几乎和你的情况一样。