用于#<user :: activerecord_relation:0xaadd320>的未定义方法`write_reviews'

时间:2015-12-08 04:47:06

标签: ruby-on-rails ruby-on-rails-4

您好我有两个名为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

但是它给出了错误

5 个答案:

答案 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))