2010-09-17 26 views
6

Rails newbie ... cố gắng tìm hiểu đúng cách để làm những việc ...Rails 3, làm thế nào thêm một kỷ lục liên quan sau khi tạo một kỷ lục chính (Sách, Auto Thêm BookCharacter)

Trong người dùng ứng dụng của tôi có thể tạo ra một cuốn sách (Tôi có làm việc đó)

Điều tôi muốn xảy ra là khi người dùng tạo sách, bản ghi được thêm vào Bảng BookCharacters, giống như (id, book.id, user.id, characterdescription.string .)

Khi sách được tạo, người dùng đã tạo sách sẽ tự động được thêm làm BookCharacter đầu tiên. Sau đó, người dùng có thể thêm/chỉnh sửa nhiều BookCharacters theo cách thủ công như họ muốn. Nhưng ban đầu tôi muốn chúng tự động được thêm vào theo mặc định.

Vì vậy, trong điều khiển Sách của tôi, tôi có:

def create 
@book = Book.new(params[:book]) 
respond_to do |format| 
    if @book.save 
.... 

Với Rails, là nó thực hành thêm loại đó của logic sau khi cuốn sách được lưu? Một cái gì đó như

Book.create(:creator => current_user.id) 

Tôi đánh giá cao sự giúp đỡ

Trả lời

16

Điều quan trọng cần hiểu là quy ước mà Rails cụ các mối quan hệ sử dụng ActiveRecord . Một cuốn sách có nhiều ký tự, và mỗi nhân vật thuộc về một cuốn sách, vì vậy:

class Book < ActiveRecordBase 
    has_many :characters 
end 

class Character < ActiveRecordBase 
    belongs_to :book 
end 

Rails tại giả định rằng các bảng characters sẽ có một chìa khóa nước ngoài gọi là book_id, có liên quan đến bảng books. Để tạo một nhân vật thuộc về một cuốn sách:

@book = Book.new(:name=>"Book name") 
@character = @book.characters.build(:name=>"Character name") 

Bây giờ khi @book được lưu (giả sử cả @book@character có hiệu lực), một hàng sẽ được tạo trong cả bookscharacters bảng, với dòng nhân vật liên quan qua số book_id.

Để chứng minh rằng một nhân vật cũng thuộc về người dùng, bạn có thể thêm rằng mối quan hệ với mô hình nhân vật:

class Character < ActiveRecordBase 
    belongs_to :book 
    belongs_to :user 
end 

Như vậy Rails bây giờ mong muốn characters cũng có chìa khóa nước ngoài gọi là user_id, mà chỉ vào một users bảng (cũng cần một mô hình User). Để xác định người sử dụng khi tạo nhân vật:

@book = Book.new(:name=>"Book name") 
@character = @book.characters.build(:name=>"Character name",:user=>current_user) 

Bạn cũng có thể gán phím nước ngoài bằng cách gọi phương thức tương ứng trên đối tượng:

@character.user = current_user 

này tất cả các công trình vì nó tuân theo quy Rails để đặt tên mô hình và bảng. Bạn có thể khởi hành từ các công ước này, nhưng bạn sẽ gặp khó khăn trong việc học Rails nếu bạn làm như vậy.

+0

Đó là câu trả lời hay nhất mà tôi từng thấy. Cảm ơn bạn đã giúp tôi hiểu đúng cách để sử dụng Rails – AnApprentice

+0

hi cảm ơn bạn @zetetic - nếu tôi có hai mô hình liên quan đến nhau, khi tôi tạo một phiên bản đầu tiên, tôi phải tự tạo một phiên bản thứ hai và tham gia cùng nhau trong bộ điều khiển, thay vì có đường ray tự động tạo bản ghi thứ hai khi tạo ra đầu tiên -> là quy ước đường ray? chrs – BKSpurgeon

0

tôi thích một cái gì đó tương tự (nếu tài has_many Book):

def create 
@book = current_user.books.new(params[:book]) 
respond_to do |format| 
    if @book.save 
    … 
+0

Cảm ơn nhưng câu hỏi của tôi là tạo ra BookCharacters ... Có lẽ tôi có thể chỉnh sửa để làm rõ hơn? – AnApprentice

+0

Vâng, sai lầm của tôi.Câu trả lời tuyệt vời bởi @zetetic! – Yannis

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