2008-10-28 18 views
4

我確定這是一個相對簡單的問題,並且必須有一個很好的明智的軌道方法,但我不確定它是什麼。添加到軌道中的多個表格

基本上,我將書籍添加到數據庫,並且我想將作者存儲在單獨的表格中。所以我有一個表格,這個表格叫做作者,這個表格被桌子所引用。

我想創建一個用於添加書籍的Rails表單,並且我希望它只是作者,標題,出版商等的簡單表單,並且如果它發現作者已經在authors表中,那麼它應該只需引用該記錄,並且如果它不在authors表中,那麼它應該添加一條新記錄並引用它。

我敢肯定有一個簡單的方法來做到這一點在軌道 - 但我似乎無法找到它。

乾杯,

羅賓

回答

5

我建議你看複雜的形式Railscasts here系列。

6

假設你的形式與書屬性傳遞一個AUTHOR_NAME和一本書的哈希,你可以做你的控制器中的以下內容:

@author = Author.find_or_create_by_name(params[:author_name]) 
@book = Book.new(params[:book]) 
@book.author = @author 
@book.save 

這將找到或者創建一個作者,然後將該作者分配給創建的書。

注意:這也假設作者可以通過他們的名字來唯一標識,通常情況並非如此。有可能是namned「史蒂芬王」那裏人多,例如,只有其中一人寫道:閃靈

+0

感謝您的快速反應!這看起來是一種很好的方式 - 儘管我在某些方面感到驚訝,Rails不會自動執行一些操作。 – robintw 2008-10-28 19:57:16

1

robintw的米迦的回答評論:

這看起來像一個好辦法做到這一點 - 雖然我在某些方面是Rails不這樣做有點吃驚的是自動

這是四行! Rails能夠自動完成多少工作?這是一個不是人類的框架。 :)

這裏,它有兩種:

@author = Author.find_or_create_by_name(params[:author_name]) 
@book = Book.create params[:book].merge({:author_id => @author.id}) 

而且洪扎的回答有很多優點:

class Book < ActiveRecord::Base 
    ... 
    def author_name=(author_name) 
    self.author = Author.find_or_create_by_name author_name 
    end 
end 

有了這個例子中,假設您的形式有一個像「一書的參數[author_name]「,你的代碼只是:

@book = Book.create params[:book] 

Wowzers。