2013-12-14 160 views
0

我有這樣的Rails代碼:Ruby on Rails的:ActiveRecord的:: StatementInvalid不能施放的ActiveRecord :: StatementInvalid

def newfood 
    memberproduct = MemberProduct.new 
    memberproduct.product_id = Product.where(:barcode_number => params[:barcode_number]).id 
    memberproduct.expiration_date = params[:expiration_date] 
    memberproduct.member_id = current_member.id 
    memberproduct.save 
end 

我所需要的產品的ID。 第三行是錯誤的。

我有一個MemberProduct表與product_id字段,expiration_date字段和member_id字段(current_member來自devise) 我有一個Product表與barcode_number字段和name字段。

我得到這個錯誤:

ActiveRecord::StatementInvalid in FoodController#newfood TypeError: can't cast ActiveRecord::Relation::ActiveRecord_Relation_Product to string: INSERT INTO "member_products" ("created_at", "expiration_date", "member_id", "product_id", "updated_at") VALUES (?, ?, ?, ?, ?)

我在做什麼錯?

回答

1

嘗試

memberproduct.product = Product.where(:barcode_number => params[:barcode_number]).first 

memberproduct.product_id是數據庫列Rails所存儲有關您memberproduct產品的ID。通常,這些不是直接使用;相反,協會的名字是。

所以這兩個工作:

def newfood 
    memberproduct     = MemberProduct.new 
    product      = Product.where(:barcode_number => params[:barcode_number]).first 
    memberproduct.product   = product 
    memberproduct.expiration_date = params[:expiration_date] 
    memberproduct.member   = current_member 

    memberproduct.save 
end 

def newfood 
    memberproduct     = MemberProduct.new 
    product      = Product.where(:barcode_number => params[:barcode_number]).first 
    memberproduct.product_id  = product.id 
    memberproduct.expiration_date = params[:expiration_date] 
    memberproduct.member_id  = current_member.id 

    memberproduct.save 
end 

,但第一種形式是比較常見的。如果您將類似productmember的對象分配給關聯,則Rails非常聰明,可以向該對象詢問其ID並自動使用它。

另外,Product.where可能會返回多個結果。由於您只希望有一個,請添加.first以僅返回第一個匹配項。

+0

謝謝,如果我必須檢索此產品的ID,該怎麼辦?將更新問題。 – hansottowirtz

+0

我不確定我是否理解 - 您確實擁有該產品。如果你確實需要模型ID,你可以使用'current_member.id'完成你的工作,並在'.first'之後添加'.id'。 – janfoeh

+0

這可能是一個愚蠢的錯誤,但我現在有這樣的代碼: 「產品= Product.where(:barcode_number => PARAMS [:barcode_number])。第一 memberproduct = MemberProduct.new memberproduct.product_id = product.id memberproduct.expiration_date = params [:expiration_date] memberproduct.member_id = current_member.id memberproduct。保存' 而且它說無定義方法'id'爲零:NilClass 但是,已經表示感謝! – hansottowirtz

1

根據Rails的版本,你應該能夠:

的Rails 3: Product.find_by_barcode_number(params[:barcode_number])

軌道4,5: Product.find_by(barcode_number: params[:barcode_number])

您可以簡化您的行動,以便:

mprod = current_member.build_member_product(expiration_date: params[:expiration_date]) 
mprod.product = Product.find_by(barcode_number: params[:barcode_number]) 
mprod.save 

儘管您可能想要處理驗證等(if mprod.save .. else

+0

我已經找到它了,但是感謝格式化問題!如果我有超過15的聲望,我肯定會投票,哈哈。 – hansottowirtz

+0

@ xprise哈哈!別擔心。 –

相關問題