Rails使用join

时间:2016-03-12 17:23:54

标签: ruby-on-rails activerecord

我有一个用户模型:

id, name, email
has_many :microposts, dependent: :destroy
has_many :comments, dependent: :destroy

Micropost模型:

id, content, title
belongs_to :user
has_many :comments, dependent: :destroy

和评论模型:

id, content, user_id, micropost_id
belongs_to :user
  belongs_to :micropost
  has_one :micropost
  has_one :user

我想通过评论本身访问每条评论的用户名。例如,我可以通过带有micropost.user.name的微博来获取用户名,这将为我提供与特定微博关联的用户的用户名。同样徒劳,我喜欢像comment.user.name或sql术语

这样的东西
select user.name from User as user join Comment as comment where user.id = comment.user_id and comment.id = 12;

当我尝试运行comment.user.name时出现错误:

User Load (1.0ms)  SELECT  "users".* FROM "users" WHERE "users"."comment_id" = ? LIMIT 1  [[nil, 3]]
SQLite3::SQLException: no such column: users.comment_id: SELECT  "users".* FROM "users" WHERE "users"."comment_id" = ? LIMIT 1

我看到SQL的问题是没有users.comment_id,但我希望SQL实际上是users.id。我怎么写这个?

2 个答案:

答案 0 :(得分:1)

从评论模型中删除has_one声明。在这种关系中,评论只会有一个用户和一个微博,由belongs_to表示。添加has_one会让人感到困惑。

简化它应该删除你的错误。

# app/models/comment.rb
class Comment < ActiveRecord::Base
  belongs_to :user
  belongs_to :micropost
end

答案 1 :(得分:0)

从您的代码中我理解您的评论模型。

def create
  @micropost = Micropost.find(params[:micropost_id])
  @comment = Comment.new(params[:comment])
  @comment.micropost = @micropost
  @comment.user = current_user

  if @comment.save
    ...
end

然后在您通过micropost_comments_path(@micropost)URL帮助程序访问的注释控制器中,您可以执行以下操作以在create操作中构建关联:

$.fn.simulateClick = function() {
    return this.each(function() {
        if('createEvent' in document) {
            var doc = this.ownerDocument,
                evt = doc.createEvent('MouseEvents');
            evt.initMouseEvent('click', true, true, doc.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
            this.dispatchEvent(evt);
        } else {
            this.click(); // IE
        }
    });
}