2011-09-22 113 views
4

我试图显示用户发布的纹身最近添加的评论。所以,如果我发布纹身,然后user_b张贴“嘿,我喜欢你的纹身”,然后我试图得到只是评论。如何使我的自定义mySQL查询在rails 3中?

的所有IM首先使用acts_as_commentable_with_threading宝石其犯规创建表即时试图加入一个外键。所以我的控制器无法找到tattoo_id,它必须寻找commentable_id

在控制器中,我将不得不调用评论模型,然后传递一些SQL的东西,但显然我不知道如何传递自定义SQL查询红宝石,因为即使我的查询字符串在终端中工作,当我尝试在rails中使用它时,我会收到各种废话。

进出口基本试图做到这一点:

SELECT comments.id FROM comments,tattoos WHERE commentable_id = tattoos.id AND 
tattoos.member_id = #{current_user} 

,其中#{} CURRENT_USER将是CURRENT_USER传入

+3

不要使用'#{CURRENT_USER}'。请参见[SQL注入](http://guides.rubyonrails.org/security.html#sql-injection)。 – Zabba

回答

4

我觉得本的方法是最好的,但以供将来参考,如果你遇到更复杂的东西,你可以随时使用SQL例如:

Comment.find_by_sql("SELECT comments.* FROM comments,tattoos WHERE commentable_id = tattoos.id AND tattoos.member_id = ?", current_user) 
+0

ahhh这真是太棒了谢谢! – rugbert

7

你没有经历这么多跳火圈做到这一点。 acts_as_commentable分配一个多态关联,所以你应该将它设置这样的:

class Comment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :commentable, :polymorphic => true 
end 

class Tattoo < ActiveRecord::Base 
    has_many :comments, :as => :commentable 
end 

class User 
    has_many comments 
end 

然后,您可以访问联想像往常一样:

Tattoo.where(:member_id => current_user).first.comments 

http://railscasts.com/episodes/154-polymorphic-association对于一般的教程协会如何多态性的工作。恰恰相反,这个railscast使用了多种形式的commentable,所以你应该可以直接跟随,如果你愿意的话。

+0

好吧,acts_as_commentable使评论模型属于评论者(用户离开评论),所以不会工作。但是,无论如何,这确实为我阐明了Rails和SQL。谢谢! – rugbert

+0

好吧,acts_as_commentable_on的工作方式是评论模型属于您分配给它的任何内容,在这种情况下是用户。但你指定一个单独的模型(或者如果你想要的话)是可以评论的,在我的例子中是一个纹身,要评论。 Acts_as_commentable然后分配“commentable_id”列来引用被评论的纹身。对不起,我需要花时间来证明我在将来阅读我的问题和帖子 – rugbert

相关问题