2011-11-02 167 views
0

我開始在Rails中使用數據庫關聯的全部(奇妙)概念,但是我遇到了問題,因爲我正在使用不符合Rails標準的現有數據庫並且無法計算了解如何命名這些關聯。有幾個類似的帖子,但如下我不能換我的頭周圍命名爲我的具體情況是:Ruby on Rails協會澄清

table book with book.formatId looks up values in book_format.id 

所以外鍵book.formatId

我的車型被命名爲: Book和BookFormat(我讀過你使用camelCase,當你的表用下劃線分隔時)。

下Book模型我有這樣的:

has_one :bookFormat, :foreign_key => 'book_format.id' # not sure if this format table.field is correct or I have to use something else here. Also not sure about the bookFormat, should it be BookFormat or bookformat? 

的BookFormat模型具有這樣的:

belongs_to :book 

但是,當我嘗試做

book = Book.first 
book.bookFormat.empty? 

我得到的錯誤未找到bookFormat方法。所以顯然有些問題,但我無法弄清楚在哪裏。

問題的第二部分是使用多對多的關係。例如:

表 書,book_subjects,book_subjects2title

book_subjects.id => book_subjects2title.pId book.id => book_subjects2title.bookId

我Apress出版讀取開始Rails 3的書(這是一本很棒的書),但這並不是很清楚,或者我只是沒有得到它。

謝謝。

回答

0

由於書店就可以了formatId,你應該使用belongs_to的,並更改外鍵這樣:

belongs_to :book_format, :class_name => 'BookFormat', :foreign_key => 'formatId' 

表名,我做了一些快速搜索,發現下面的方法: set_table_name

所以,你應該能夠在其模型的頂部添加,像這樣:

class Book < ActiveRecord::Base 
    set_table_name 'book' 
    # the rest of book model code 
end 

class BookFormat < ActiveRecord::Base 
    set_table_name 'book_format' 
    # rest of book_format model code 
end 

常軌使用複數表名,所以爲什麼你需要在那裏指定它。

+0

我會嘗試一下你的建議,但是隻是想說,爲了防止rails使用你的複數,把它放到config/application.rb文件中:'config.active_record.pluralize_table_names = false'並且工作時不需要明確設置表名。在leas Book.first的作品中,查詢正確的表格。 – kakubei

+0

我按照你的建議完成了,但我仍然收到找不到方法的錯誤。因此,澄清,'belongs_to:book_format'(book_format是表的名稱,是嗎?), 然後我使用call book.bookformat.empty?是BoookFormat,book_format還是bookformat?我在這裏使用了什麼? – kakubei

+0

對於在何處使用表名以及在何處使用類名稱,我仍然很困惑,爲什麼我們使用小寫的類名(如果它們實際上是用大寫字母來創建的)。我知道,如果你遵循rails的準則,併爲你創建表格,那麼一切似乎都會更好,但不幸的是,對於我來說,我不得不與現有的數據庫搏鬥。 – kakubei

0

agmcleod把我在正確的軌道上,所以這裏的在希望的完整的答案,這可以幫助其他人有類似問題:

我創建了一個不同的名稱,型號,方便閱讀。因此,模型書籍將擁有:

class Books < ActiveRecord::Base 
    set_table_name 'bookpedia' 
    belongs_to :format, :foreign_key => 'formatId' # we need to specify the foreign key because it is not the rails default naming 
    has_many :author2title, :foreign_key => 'bookId' 
    has_many :author, :through => :author2title 
end 

模型格式:

class Format < ActiveRecord::Base 
    set_table_name 'book_format' 
    has_many :books 
end 

然後類的實例將有格式的方法:

@book = Books.first 
@book.format # Hardcover 

對於多對多的關係,我會粘貼這裏的語法,因爲這花了我一段時間才弄清楚:

class Author < ActiveRecord::Base 
    set_table_name 'book_author' 
    has_many :author2title, :foreign_key => 'pId' # junction table 
    has_many :books, :through => :author2title # establishing the relationship through the junction table 
end 

這是實際的結合表:

class Author2title < ActiveRecord::Base 
    set_table_name 'book_author2title' 
    belongs_to :author, :foreign_key => 'pId' # foreign key needs to be here as well 
    belongs_to :books, :foreign_key => 'bookId' 
end 

上面的書模型對這種多對多的關係已經在它必要的條目。

如果有人需要澄清這一點,我會很樂意承擔義務,因爲我掙扎了一天多的時間才弄明白這一點,所以很樂意提供幫助。

乾杯。

+0

很高興你找到答案! – agmcleod