在Ruby中绑定变量

时间:2010-11-30 09:21:34

标签: mysql ruby-on-rails binding

我目前有一个表格如下:

projects = Project.find(:all, :conditions => [conditions + "AND (name LIKE ? OR description LIKE ?)", "%#{params[:query]}%", "%#{params[:query]}%"])

其中

 conditions = Project.in_used_projects(:alias => "projects")

但是我需要包含一个第三个变量,它不是来自Project表而是来自Tags表。我需要的列是Tag - > Names。无论如何我可以从Ruby中的另一个表绑定变量吗? Project.find(all)会自动将SELECT * FROM Project传递给MYSQL。有人建议使用连接功能,但我不确定这是如何工作的。有什么想法吗?

编辑1

我尝试了使用

的建议答案
projects = Project.find(:all, :joins => "tags", :conditions => [conditions + "AND (projects.name LIKE ? OR description LIKE ? OR tags.name LIKE ?", ["%#{params[:query]}%" * 3]].flatten)

但现在我又收到了另一个错误

Mysql::Error: Unknown table 'projects': SELECT {项目{1}} {项目{1}}

考虑到项目表存在,这很奇怪。为什么Ruby现在还没有认识到我已经包含了另一个表?

3 个答案:

答案 0 :(得分:2)

尝试这个尺寸:

projects = Project.find(:all, :joins => "tags", :conditions => [conditions + "AND (projects.name LIKE ? OR description LIKE ? OR tags.name LIKE ?", ["%#{params[:query]}%" * 3]].flatten)

:joins选项告诉Active Record在tags表上执行SQL连接,这将允许您对tags列执行查询。另请注意,在此示例中,我如何将projects.前缀添加到原始name列。这样您的数据库就不会混淆您想要的name列;来自projectstags表的那个。

答案 1 :(得分:1)

项目和标签之间有关系吗?如果您的查询的原因是,它应该反映在模型中(例如,使用HABTM),这也使您能够轻松地根据该关系进行过滤,而无需制作复杂的SQL查询。

答案 2 :(得分:0)

原来这只是一个简单的语法错误

projects = Project.find(:all, :joins=>:tags, :conditions => [conditions + "AN    rojects.name LIKE ? OR projects.description LIKE ? OR tags.name LIKE ?)", "%#    ams[:query]}%", "%#{params[:query]}%", "%#{params[:query]}%"])

是正确的语法。 :连接需要跟随:标签,而不是“标签” 再次感谢大家的帮助