0

对...我已经花了 3 天的时间尝试自己做这件事。

我有 2 个模型,称为 Film 和 Screenings。放映属于_电影,电影有_许多放映。

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

放映具有属性(:start_time, :date_being_screened, :film_id(Film 的外键))。

我想做的是针对这两个模型创建一个搜索。我想做这样的事情......

@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

我会将搜索功能提取到一个单独的(非 ActiveRecord)类中,例如AdvancedSearch它不完全适合FilmorScreening类。

无需编写复杂的 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-27T14:40:34.697 回答
0

我想写点东西,但这个演员表说的都是http://railscasts.com/episodes/111-advanced-search-form

和你的情况几乎一样。

于 2013-02-27T16:23:38.343 回答