Ciao ragazzi, ho un problema che non riesco a risolvere, spero che
qualcuno possa illuminarmi, allora:
ho le seguenti tabelle:
create_table :carts do |t|
t.belongs_to :user
t.boolean :escapee, :default => 0
t.timestamp :escapee_at
t.timestamps
end
create_table "products" do |t|
t.column " id", :integer
t.column "name", :string
end
create_table "carts_products", :id => false, :force => true do |t|
t.column "cart_id", :integer
t.column "product_id", :integer
t.column "quantity", :integer
end
e il seguente modello
class Cart < ActiveRecord::Base
has_and_belongs_to_many :products
def self.update_carts(session_cart)
cart = self.find(:first, :order => "created_at DESC", :limit =>
1, :conditions => “escapee=0”)
product_ids = []
session_cart.each do |id, item|
product_ids << [id]
end
cart.update_attributes(:product_ids => product_ids)
end
end
Dal controller:
…
if logged_in?
current_user.carts.update_carts session[:cart]
end
…
Volevo sapere come poter incrementare il campo quantità qualora il
record esista. Spero di essere stato chiaro nel farvi capire cosa
cerco.
Un grazie in anticipo a tutti quelli che risponderanno.
Ciao ciao,
Salvatore
2009/8/1 Salvatore [email protected]:
end
create_table “carts_products”, :id => false, :force => true do |t|
t.column “cart_id”, :integer
t.column “product_id”, :integer
t.column “quantity”, :integer
end
ciao,
quando la tabella associativa contiene altri campi oltre ai due id,
per quel che so non si usa has_and_belongs_to_many ma has_many
through,
così:
class Cart < ActiveRecord::Base
has_many :carts_products
has_many :products, :through => :carts_products
end
class Products < ActiveRecord::Base
has_many :carts_products
has_many :carts, :through => :carts_products
end
class CartsProduct < ActiveRecord::Base # nota: plurale/singolare
belongs_to :cart
belongs_to :product
end
poi potrai usare @cart.products e @product.carts, ma anche
@cart.carts_products.first().quantity.
per quello che vuoi fare, credo ti basti aggiungere pochi metody alle
classi, o forse ancora meglio all’associazione, modificando l’esempio
riportato in
class Account < ActiveRecord::Base
has_many :people do
def find_or_create_by_name(name)
first_name, last_name = name.split(" ", 2)
find_or_create_by_first_name_and_last_name(first_name,
last_name)
end
end
end
person = Account.find(:first).people.find_or_create_by_name(“David
Heinemeier H.”)
person.first_name # => “David”
person.last_name # => “Heinemeier H.”
pietro