这必须是rails中的基本内容,但我不知道该怎么做。
我想根据他们说的语言过滤参与者。人们可以说多种语言,并且语言以一对多的关系存储在他们自己的表中。
现在我的搜索看起来很笨拙,似乎不起作用:
if @cvsearch.language.present? == true and @cvsearch.language != 0
@p = @p.joins(:languages).where('languages.name = ?', @cvsearch.language)
else
@cvsearch.language = 0
end
if @cvsearch.language1.present? == true and @cvsearch.language1 != 0
@p = @p.joins(:languages).where('languages.name = ?', @cvsearch.language1)
end
if @cvsearch.language2.present? == true and @cvsearch.language2 != 0
@p = @p.joins(:languages).where('languages.name = ?', @cvsearch.language2)
end
if @cvsearch.language3.present? == true and @cvsearch.language3 != 0
@p = @p.joins(:languages).where('languages.name = ?', @cvsearch.language3)
end
生成的 SQL,略微缩短:
SELECT COUNT(*) FROM "participants" INNER JOIN "languages" ON "languages"."participant_id" = "participants"."id" WHERE (participants.id >= 2) AND (languages.name = 11) AND (languages.name = 10)[0m
获得一个具体的解决方案会很棒,但更好的是一个关于我可以在哪里阅读的指针——我缺少什么关键词来描述这个问题?
所以这是我现在使用的解决方案:
if @cvsearch.language1.present? == true and @cvsearch.language1 != 0
safe_lang = ActiveRecord::Base::sanitize(@cvsearch.language1)
qry = "INNER JOIN languages l1 ON l1.participant_id = participants.id AND l1.name = " + safe_lang.to_s
@p = @p.joins(qry)
end
效果很好,只需要获得一些关于这种方法安全性的反馈。