現在我有三種模型:Product,Cart,CartItem。下面是相關的方法和關聯:find_by_product_id(params [:id])vs find_by(params [:product_id])有什麼區別
cart.rb
class Cart < ApplicationRecord
has_many :cart_items
has_many :products, :through => :cart_items, :source => :product
cart_item.rb(它有2個相關的整數列,:product_id
& :cart_id
)
class CartItem < ApplicationRecord
belongs_to :cart
belongs_to :product
application_controller。 rb
class ApplicationController < ActionController::Base
helper_method :current_cart
def current_cart
@current_cart ||= find_cart
end
private
def find_cart
cart = Cart.find_by(id: session[:cart_id])
if cart.blank?
cart = Cart.create
end
session[:cart_id] = cart.id
return cart
end
end
在carts_controller.rb我所限定的方法來刪除在推車#索引頁特定cart_item:
class CartsController < ApplicationController
def destroy_one
@cart_item = current_cart.cart_items.find_by_product_id(params[:id])
@product = @cart_item.product
@cart_item.destroy
redirect_to :back
在destroy_one方法的第一行,我可以用find_by_product_id(params[:id])
得到正確的cart_item
然後我試着find_by(product_id: params[:id])
,它也可以。
但是,如果我使用find_by(params[:product_id])
,出現了問題。當我點擊刪除按鈕時,它不會引發異常,但會刪除其他cart_item。似乎欄杆隨機挑選cart_item並將其刪除。
顯然,find_by(params[:product_id])
在這裏工作不正確。
我的問題是:
在這種情況下,我混淆軌如何找到一步正確的對象步驟?在一個購物車中,有很多cart_items和產品,通過使用:product_id
來合理地定位cart_item。但是,什麼是之間的區別:VS find_by(params[:product_id])
find_by_product_id(params[:id])
分別,他們是如何工作的?
謝謝菲利普,在閱讀Rails指南並做了幾個實驗後,現在我可以理解你所說的了。問題是我誤解了軌道檢索數據的方式。 – Caven
不客氣:) –