Rails - 在Create上的模型中更新布尔属性

时间:2014-12-29 01:12:08

标签: ruby-on-rails ruby

我正在创建一个允许用户从在线商店购买商品的应用。我按照RailsCasts剧集,并像我这样构建我的OrdersController

  def create
    @order = current_cart.build_order(order_params)
    @order.ip_address = request.remote_ip
    if @order.save
      if @order.purchase
        Item.where(email: Order.last.email).last.purchased == true  
        PurchaseMailer.confirmation_email(Item.last.email).deliver                        
        flash[:notice] = "Thanks for your purchase"
        redirect_to root_path
      else
        flash[:danger] = "Something was wrong"
        redirect_to :back
       end
     else
       render :action => 'new'
    end
  end

我最近决定在我的商品中添加一个属性,说明他们是否已购买。购物车中的商品尚未购买。我创建了一个迁移,为所有项目提供了一个已购买的属性,即boolean

默认情况下,不购买商品,因此默认值为false。

class AddPurchasedToItem < ActiveRecord::Migration
  def change
    add_column :items, :purchased, :boolean, :default => false
  end
end

这就是为什么我将这行代码添加到我的Orders#Create操作中。

Item.where(email: Order.last.email).last.purchased == true

这里我将购买的值从false设置为true。但是,当我加载rails console

Item.last.purchased
=> false

看起来价值仍然没有被存储

2 个答案:

答案 0 :(得分:0)

正如另一个回应所指出的那样,你正在使用==来分配一个不正确的值。您需要=代替。

您必须在为其指定值后保存项目。

一个例子:

conditions = {email: Order.last.email} # using your conditions
item = Item.find_by(conditions)
item.purchased = true
item.save # this is what you're missing
Item.find(item.id).purchased # will be true

另一种更新方式如下:

item.update_attribute(:purchased, true)

另一种方法是在ActiveRecord :: Relation对象上调用update_all,如下所示:

# update all items that match conditions:
Item.where(conditions).update_all(purchased: true)

您选择的方法可能取决于方案,因为update_all未运行您在模型中指定的回调。

但是,在您的情况下,您所缺少的只是item.save行。

答案 1 :(得分:0)

Item.where(email: Order.last.email).last.purchased == true

您正在使用==运算符尝试分配值。请尝试使用=