【问题标题】:Ruby on Rails search 2 modelsRuby on Rails 搜索 2 个模型
【发布时间】:2013-02-27 14:21:32
【问题描述】:

对...我已经花了 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])

然后在 Film 模型中...

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 

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

感谢大家的帮助

【问题讨论】:

  • 你能用纯文本而不是代码解释你想要的结果是什么吗?
  • 抱歉...我希望结果是符合 :conditions 标准的电影集合。我可以让它在一个模型而不是两个模型中搜索?

标签: ruby-on-rails ruby search models


【解决方案1】:

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

您可以只搜索电影,然后是放映,然后组合结果,而不是编写复杂的 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 匹配,则需要计算出数组交集)。

【讨论】:

  • 看起来就是这样!我会尽快回复您的最新消息...非常感谢您的帮助!
  • 当您说单独的(非 ActiveRecord)时,您的意思是指名为 advanced_search 的新控制器和模型吗?对不起,我很笨:-/
  • 不,您不需要控制器或模型。这个概念被称为服务对象。见blog.codeclimate.com/blog/2012/10/17/…
  • 我很困惑...抱歉,这个新的高级搜索类应该放在哪里?
  • 有些人会将其放在/lib 中,但由于它与您的域逻辑密切相关,我会将其保留在/app/models 中。 (我之前说您不需要模型时可能让您感到困惑 - 我的意思是您不需要 ActiveRecord 模型)。
【解决方案2】:

我想写点东西,但这个演员表说明了一切http://railscasts.com/episodes/111-advanced-search-form

和你的情况差不多。

【讨论】:

  • 感谢链接,但不是我想要的……Andy Waite 提供的代码和建议似乎正是我需要的那种功能……我只是不知道我在哪里'应该包括他提供的 AdvancedSearch 课程......有什么想法吗?
猜你喜欢
  • 2014-10-20
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
相关资源
最近更新 更多