我有一个用户模型:
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。我怎么写这个?
答案 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
}
});
}