您好我有两个名为users和write_reviews的表,我已经创建了用户has_many write_reviews之间的活动关联,而write_reviews belongs_to用户 在我的方法中,我试图这样做
def details
@user = User.all
@writereview = @user.write_reviews.all
respond_to do |format|
format.html
format.json { render json: @writereview }
end
在我的write_review模型中,它定义为
class WriteReview < ActiveRecord::Base
belongs_to :user
end
但是它给出了错误
答案 0 :(得分:0)
User.all
返回所有用户的数组(ActiveRecord::Relation
)。
write_reviews关系与单个用户实例相关联。
用户有很多wirte_reviews,而不是用户(User.all)
@user
必须是一个用户实例。
答案 1 :(得分:0)
您必须在write_reviews
对象上致电User
,而不能在ActiveRecordRelation
上执行此操作。这就是你得到这个错误的原因。你可以这样做:
@user = User.first # or something else that returns a single user
@writereview = @user.write_reviews.all
答案 2 :(得分:0)
未定义的方法`write_reviews&#39; for User :: ActiveRecord_Relation:0xaadd320
错误是由于这一行
@writereview = @user.write_reviews.all
此处@user
根据您的代码是用户记录的 集合 ,因此@user.write_reviews
是错误的。
如果您想获得特定用户的write_reviews
,则需要将@user = User.all
更改为@user = User.find(params[:id])
答案 3 :(得分:0)
所以首先代码看起来像这样,以便检索所有用户的writereviews:
@users = User.all
所以现在 @users 包含了所有用户,这里没有什么比这更复杂了。我们要将变量 @writereviews 声明为数组。
@writereviews = []
@users.each do |u|
@writereviews << u.writereviews.all
end
现在,您拥有每个用户的所有写评论。第一个元素是一个包含第一个用户的所有 writereviews 的数组。我们会这样说的
@writereviews[0] // is an array containing all the write reviews of your first user.
@writereviews[0][0] // is the nested array containing the FIRST writereview of your
FIRST user
@writereviews[0][0].user // will give you the user of that review.
所以为了检索那些writereviews的用户,我在另一个内部带了一个循环。
@authors = []
@writereviews.each do |element|
element.each do |subelement|
@authors << subelement.user
break // so that it doesnt neet to loop over the other writereviews, since they will all belongs to the same user.
end
end
就是这样,您可以使用 @authors 来检索每个writereview的用户, @authors [0] 是 @writereviews的用户[ 0] ,您需要做的就是在模板中使用这些变量。
希望你现在更清楚了!
为json部分:
@total = [] #each element of this array would contain a hash of _'user, reviews[]'_
wrev = {} # a hash that will contain the user, and its write reviews
wrev["user"] = ""
wrev["wrev"] = [] #reviews are an array
@users.each do |u|
wrev["user"] = u.email
wrev["wrev"] = []
wrev["wrev"] = u.writereviews.all
@total << wrev
wrev = {}
end
respond_to do |format|
format.html
format.json { render json: @total }
end
答案 4 :(得分:0)
User.all
返回一组用户,而write_reviews
仅在单个用户上可用。
实际上,在您的情况下,您不需要用户选择write_reviews,而只需执行以下操作:
@write_reviews = WriteReview.all
但是如果你只想为特定用户选择write_reviews,你可以这样做:
@users = User.where(status: 'active') # just an example
@write_reviews = WriteReview.where(user_id: @users.map(&:id))