【问题标题】:Getting error when showing the purchases of the user,when showing the product he bought i get an error for product image and title显示用户购买时出现错误,显示他购买的产品时出现产品图像和标题错误
【发布时间】:2015-07-30 07:32:53
【问题描述】:

这是我在 User、Gig(product) 和记录购买的 Purchase 表之间的关系。

class User < ActiveRecord::Base
  has_many :gigs
  has_many :purchases, foreign_key: 'buyer_id'
  has_many :sales, foreign_key: 'seller_id', class_name: 'Purchase'
end

class Gig < ActiveRecord::Base
  has_many :purchases
  has_many :buyers, through: :purchases
  has_many :sellers, through: :purchases
end

class Purchase < ActiveRecord::Base
  belongs_to :gig
  belongs_to :buyer, class_name: 'User'
  belongs_to :seller, class_name: 'User'
end

记录我在控制器中使用的购买

 def downloadpage
    ActiveRecord::Base.transaction do
      if current_user.points >= @gig.pointsneeded 
        @purchase = current_user.purchases.create(gig: @gig, seller: @gig.user)
        if @purchase
          current_user.points -= @gig.pointsneeded
          @gig.user.points += @gig.pointsneeded
          current_user.save
          if @gig.user.save
            render 'successful_download', locals:{link:@gig.boxlink}
          end
        end
      else
        redirect_to :back, notice: "You don't have enough points"
      end
    end
  end

当买家从卖家那里购买东西时一切正常,积分在账户之间转移,买家被重定向到最终演出。

在我看来我可以做到

<h1>You downloaded <%= current_user.purchases.count %> boxes</h1>

它将显示买家制作的“演出”数量。

现在我想显示的不仅仅是数字,而是他购买的产品的标题和图片。这就是我尝试过的

<div class="row experiment">
      <% current_user.purchases.each do |gig| %>
      <div class="well for-h1-gig-second col-xs-6 col-sm-4 col-lg-3 ">
        <%= link_to (image_tag gig.image.url(:medium), :class=>"img-responsive"), gig %>
        <h1><%= link_to gig.title, gig %></h1>
      </div>
      <% end %>
    </div>

但它说,它找不到图像和标题。 所以我尝试了current_user.purchases.gig.each do |gig| 没有成功。

我该如何解决? P.S:请随意编辑我的标题,对于未来的读者,我无法更好地表述它,谢谢。

【问题讨论】:

    标签: ruby database ruby-on-rails-4 model-view-controller model


    【解决方案1】:

    您的主要问题是 current_user.purchases.each 迭代购买 - 而不是演出。

    <div class="row experiment">
        <% current_user.purchases.each do |purchase| %>
        <% gig = purchase.gig %>
        <div class="well for-h1-gig-second col-xs-6 col-sm-4 col-lg-3 ">
            <%= link_to(image_tag gig.image.url(:medium), :class=>"img-responsive"), gig %>
            <h1><%= link_to gig.title, gig %></h1>
        </div>
        <% end %>
    </div>
    

    还有其他一些问题:

    class User < ActiveRecord::Base
      has_many :gigs # not going to work.
    end
    

    它不起作用的原因是user 和gig 之间的关系通过purchases 和buyer_id 和seller_id 外键。 Rails 不支持依赖多个键的关系。

    如果您想选择用户是卖家或买家的演出,您可以使用:

    Gig.joins(:purchases).where('purchases.buyer_id=? OR purchases.seller_id=?', [current_user.id, current_user.id])
    

    【讨论】:

    • 你会在哪里使用你的解决方案,在演出控制器中?在“def 下载页面”操作中?
    • 另外,如果我删除has_many :gigs,我将无法使用current_user.gigs,我尝试删除它,但我不能再使用它了,它给出了一个错误,没有那行。
    • 如果您想访问用户出售/购买的演出,您可以设置关系,如 NoobExceptions 答案。如果你需要两者都使用@gigs = Gig.joins(:purchases).where('purchas...
    【解决方案2】:

    尝试在用户上添加关联:

    class User < ActiveRecord::Base
      has_many :purchases, foreign_key: 'buyer_id'
      has_many :gigs, through: :purchases, source: :buyer
      has_many :sales, foreign_key: 'seller_id', class_name: 'Purchase'
    end
    

    那么你应该可以遍历 current_user.gigs

    【讨论】:

    • 对不起,我没有在我的问题中提到,我已经在我的“用户”模型has_many :gigs,我试图用你的建议替换它,但它仍然给出一个错误,它可以找不到他购买的产品的图片和标题。你说“循环浏览 current_user.gigs”,我认为它会显示用户上传自己的演出,而不是他从其他用户下载的演出,如果我是正确的错了。
    • 我现在的代码也可以使用'current_user.gigs'并且它可以工作,但显示用户上传的演出,而不是他购买的演出。当我使用'current_user.purchases.count'时工作并显示下载次数,但如果我尝试显示演出,以及他们的标题和图像,它说它找不到它,也许它应该像 current_user.purchases.gigs ......但它仍然不起作用。
    • 您不能执行 current_user.purchases.gigs,因为您的关联设置为另一种方式,演出有很多购买,它必须是 current_user.gigs.purchases。
    • 仍然不是一个好主意 - 协会名称 gigs 非常含糊,如果不打开课程,您无法真正分辨出它的销售单位。 sold_gigs 你在前面的例子中使用的更好。
    猜你喜欢
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多