用户
如果这将是特定于用户的,我将从负责保存每组唯一搜索词的用户模型开始。考虑登录或会话。
假设您使用前面提到的 Category 方法,并假设有一个名为 name 的列。每个搜索词都将作为单独的实例存储在数据库中。想想标签。
包含存储列表中的一个(或多个)搜索词的标题
类别
由于每个类别都有许多术语,并且所有查询都将是 OR 查询,因此连接用户和类别的模型,存储搜索词是合适的。
我还假设您有一个包含实际故事的 Story 模型,尽管这可能不会保留在数据库中。我预测你的故事模型有一个标题和一个正文。
终端控制台
rails generage model SearchTerm query:string user:references category:references && rake db:migrate
型号
在您现有的用户和类别模型上,您将添加:
# app/models/user.rb
has_many :search_terms
has_many categories, through: :search_terms
# app/models/category.rb
has_many :search_terms
has_many :stories
Rails 控制台
这将自动使您可以这样做:
@user = User.last # this is in the console, just to demonstrate
@category = Category.find_by_name("politics")
@user.search_terms.create {query: "rajoy", category: @category}
@user.search_terms.create {query: "pp", category: @category}
@user.search_terms.where(category_id: @category.id).pluck(:query)
-> ['rajoy', 'pp']
控制器
您希望对控制器(可能是 Category 控制器)执行的操作是解析文本字段并更新数据库中的搜索词。如果你想用逗号和空格分隔字段,你可以这样做:
@user.search_terms.where(category: @category).delete_all
params[:search_term][:query].split(", ").map{|x| x.gsub("\"", "")}.each do |term|
@user.search_terms.create({category: @category, query: term})
end
前端
不过,就我个人而言,我会让前端使用起来不那么复杂,比如只需要逗号、不带引号,或者只需要空格和引号。
搜索
对于大结局,要显示标题中包含搜索词的故事:
Story.where(@user.search_terms.where(category: @category).pluck(:query).map { |term| "heading like '%#{term}%'" }.join(" OR "))
我建议使用 pg_search gem 而不是尝试维护这样的复杂查询。
注意:我确定这其中存在错误,因为我无法实际创建整个应用程序来回答您的问题。我希望这可以帮助您开始实际需要做的事情。我鼓励您在解决此问题时发布包含一些代码的问题。
参考