对的..。我花了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 我不认为这会像这样工作,但我希望我的解释足够详细,让任何人都能理解我试图做什么??:-/
谢谢你们的帮助
发布于 2013-02-27 22:40:35
我会将搜索功能提取到一个单独的(非ActiveRecord)类中,比如AdvancedSearch,因为它既不适合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更新
假设您的高级搜索表单有两个字段--类型和位置。因此,当您提交表单时,发送的参数为:
{ :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-28 00:23:38
我想写点东西,但是这个演员说所有的http://railscasts.com/episodes/111-advanced-search-form
和你的差不多一样的案子。
https://stackoverflow.com/questions/15114406
复制相似问题