是的......我已经花了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
我不认为这可能会像这样工作,但我希望我的解释足够详细,任何人都可以理解我在做什么? : - /
感谢任何帮助人员
答案 0 :(得分:0)
我会将搜索功能提取到单独的(非ActiveRecord)类中,例如AdvancedSearch
,因为它不能完全适合Film
或Screening
类。< / 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
几乎和你的情况一样。