2012-12-26 30 views
7

Tôi có hai mô hình: (Album và sản phẩm)Tạo mối liên hệ giữa hai đối tượng instancied

1) Bên Models

Bên album.rb:

class Album < ActiveRecord::Base 
    attr_accessible :name 
    has_many :products 
end 

Bên product.rb:

class Product < ActiveRecord::Base 
    attr_accessible :img, :name, :price, :quantity 
    belongs_to :album 
end 

2) Sử dụng "bảng điều khiển đường ray", làm cách nào tôi có thể t các hiệp hội (vì vậy tôi có thể sử dụng "<% = Product.first.album.name%>")?

ví dụ:

a = Album.create(:name => "My Album") 
p = Product.create(:name => "Shampoo X") 
# what's next? how can i set the album and the product together? 

Trả lời

10

Bạn có làm như thế này:

a = Album.create(name: "My Album") 

p = Product.create(name: "Shampoo X") 
# OR 
p = Product.create(name: "Shampoo X", album_id: a.id) 
# OR 
p.album = a 
# OR 
p.album_id = a.id 
# OR 
a.products << a 
# finish with a save of the object: 
p.save 

Bạn cần phải thiết lập các thuộc tính dễ tiếp cận để album_id trên mô hình sản phẩm (không chắc về điều đó).

Kiểm tra nhận xét của @bdares '.

+1

Nếu bạn thêm '_id' để truy cập, sau đó bạn có thể chỉ cần dính vào giá trị id như bạn nhanh chóng nó: 'Product.create (tên: 'Shampoo', album_id: a.id) ' – bdares

+0

@bdares Để thêm _id, tôi chỉ cần sử dụng' attr_accessible: img,: name,: price,: quantity,: _id', phải không? Tuy nhiên, nó cho tôi lỗi này, 'ActiveModel :: MassAssignmentSecurity :: Error: Không thể gán khối lượng thuộc tính được bảo vệ: album_id' –

+0

@MrYoshiji, Đối với' p.album = a', nó tạm thời hoạt động, nhưng nếu tôi mở lại console, p.album chuyển thành "nil". Đối với 'p.album_id = a.id', nó đưa ra lỗi này, 'NoMethodError: undefined method' album_id = ''. Đối với 'a.products << p', nó đưa ra lỗi này,' RuntimeError: không thể sửa đổi Hash bị đóng băng '. Tôi có cần phải tạo lại cả hai mô hình không? Cảm ơn mọi người! –

2

Thêm hiệp hội khi tạo sản phẩm:

a = Album.create(:name => "My Album") 
p = Product.create(:name => "Shampoo X", :album => a) 
+0

Nó tạm thời hoạt động. Tuy nhiên, nếu tôi mở lại bàn điều khiển, p.album sẽ chuyển thành "không" .. –

+0

Bạn có đang tìm nạp cùng một 'Sản phẩm' mà bạn đã tạo lần đầu tiên không? Hãy thử đoạn mã trên, sau đó mở lại bàn điều khiển và thử 'Product.find_by_name ('Shampoo X'). Album'. –

Các vấn đề liên quan