<<如果添加重复项目,则无法工作

时间:2014-12-01 00:52:38

标签: ruby-on-rails ruby-on-rails-4 collections has-many

Ticket has_many :productsProduct belongs_to :ticket
这段代码:

def prepare
  @ticket = Ticket.last
  if @ticket.status != "open"
    @ticket = Ticket.create!
  end
  @ticket.products<<(Product.find(params[:id]))
  respond_to :js
end
如果@ticket中已存在同一产品(具有相同ID)的任何实例,

将不会向@ ticket.products添加新产品。我希望能够在一张票中添加两个相同的产品 - 顾客应该可以订购两种相同的啤酒,不应该吗?

我挖掘了here in edgeguides,但似乎只是避免重复,而不是启用它。

2 个答案:

答案 0 :(得分:1)

听起来更像是多对多的关系,可以通过has_many来管理:通过关联:

http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association

考虑购物车示例,客户可以通过订单项订购多个相同产品,该订单项有数量。

答案 1 :(得分:0)

您可以尝试使用 gem:

添加尚未添加的产品
@ticket.products << Product.where(Product.arel_table[:id].eq(params[:id])
                           .and(Product.arel_table[:ticket_id].not_eq(@ticket.id)))

您可以使用where.not否定:

@ticket.products << Product.where(id: params[:id]).where.not(ticket_id: @ticket.id)