如何在Rails中按分类名称搜索?Job模型搜索功能改造咨询
回答
嘿,要实现按分类名称搜索其实很简单,核心是让Job模型关联到Category表,然后查询分类的name字段就可以了。首先得确认你的Job和Category模型已经建立了正确的关联:
- 在
Job模型里添加:belongs_to :category - 在
Category模型里添加:has_many :jobs
如果关联已经搞定,接下来就可以修改你的search方法了,这里给你两种常用的实现方式:
方式1:用JOIN关联表(推荐,查询效率更高)
直接在数据库层面关联两张表,这样查询更高效,记得给字段加上表名前缀避免冲突:
def self.search(search) if search.present? joins(:category) .where("jobs.title LIKE ? OR jobs.description LIKE ? OR categories.name LIKE ?", "%#{search}%", "%#{search}%", "%#{search}%") else all # 这里返回所有职位,保持方法返回值的一致性,方便后续链式调用 end end
方式2:用includes预加载(适合需要后续使用Category属性的场景)
如果你之后需要用到分类的其他属性,用includes可以避免N+1查询,本质是生成子查询:
def self.search(search) if search.present? includes(:category) .where("jobs.title LIKE ? OR jobs.description LIKE ? OR categories.name LIKE ?", "%#{search}%", "%#{search}%", "%#{search}%") else all end end
额外优化:避免SQL注入风险
上面的写法虽然能用,但有轻微的SQL注入风险,更安全的方式是用Rails的Arel语法来构建查询条件:
def self.search(search) return all unless search.present? # 构建各个查询条件 title_match = arel_table[:title].matches("%#{search}%") description_match = arel_table[:description].matches("%#{search}%") category_name_match = Category.arel_table[:name].matches("%#{search}%") # 关联表并组合条件 joins(:category).where(title_match.or(description_match).or(category_name_match)) end
这种写法既安全,又符合Rails的最佳实践,而且可读性也更强。
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

