2009-02-07 57 views
3

鑑於ActiveRecord的下表之間的關係:我不知道如何快速三個獨立的表

  • 作者
  • 網站
  • 文章

我不知道如何表達作者根據出版物支付不同的金額,但是爲同一出版物工作的作者具有不同的費率:

  • 約翰發表在美孚爲$ 300
  • 文章約翰發表在酒吧爲$ 350
  • 文章約翰發表在巴茲爲$ 400
  • 文章迪克發表在美孚爲$ 250
  • 文章迪克發佈在酒吧爲$ 400

什麼樣的關係是我努力的文章用來描述?

目前我有一個「價格」表作者_id, site _id和金額列。鑑於publication.id和author.id,我得出的文章與

cost = Rate.find(:first, :conditions => ["author_id = ? and site_id = ?", author.id, site.id]).rate 

這一工程的成本,但我不知道這是最好的方式,我不知道如何確保我不最終'約翰'有兩個'巴茲率'。

我不認爲我想要的代碼太多,因爲我想讓別人說「哦,那是一種......關係」,所以我可以掌握我在Googleing的內容。

回答

5

它的一個擁有和擁有豐富的連接表很多。

class Author 
    has_many :publications, :through => :rates 
end 

class Publication 
    has_many :authors, :through => :rates 
end 

class Rate #rich join table 
    belongs_to :author 
    belongs_to :publication 
end 

然後你就可以簡化您的發現是這樣的:

@author.rates.find_by_site_id(123) 

另外,你翻過連接表

@author.publications 
@publication.authors 
+0

謝謝!一旦我添加了 has_many:率 給作者和出版物,它工作如廣告。 – mph 2009-02-07 02:28:53

1

它很簡單,但我不知道這個關係是否有特定的名稱。

它看起來像你需要三個表:

  1. 作者(約作者信息)
  2. 網站(有關網站信息)
  3. 率作者/網站(速率信息只)

在第三張表格中您至少需要:

  • 作者ID(FK爲作者,和主鍵)
  • 網站ID(FK到站點,和主鍵)

,價格表有兩個字段作爲具有唯一約束主鍵。任何涉及作者和網站的連接都將涉及一個3表連接。

+0

簡而言之:「在費率表中使用(author_id,site_id)上的主鍵」。 PK意味着一個唯一的約束,它保證了例如'約翰'永遠不可能有兩個'巴茲'率。 – 2009-02-07 02:29:08

0

我會用第三張表:

author_site_mapper 
------------------ 
id 
author_id 
site_id 
rate 

我通常聽到這個被稱爲「映射」關係。它表示兩個表之間的多對多關係。

1

當三個實體的相互關係,它直接訪問稱爲三元關係。

我們處理的大多數關係都是二元的,將兩個實體相互關聯。例如,「參與」學生和課程之間的關係。二進制關係進一步分爲多對多,多對一和一對一。但你知道這一點。

三元關係可分爲多對多關係,多對多關係,多對一對等關係,依此類推。

二元和三元關係可以進一步推廣到n元關係。

下面是我如何看待您概述的情況:有三個實體:作者,出版物和文章。除了這三個實體之外,還有一個措施,即費率。我可能是錯的。

所以我會看到三個實體表:

作者與PK的AuthorID。
與PK PublicationID的出版物。
文章與PK ArticleID。

然後將有與四列的關係表:

的AuthorID(FK), PublicationID(FK), AtricleID(FK), 速率這是一個貨幣金額。

這樣做的PK是(的AuthorID,PublicationID,條款ArticleID)

這並不是說,在本設計中,不存在率表。這只是一個措施。

還要注意的是,在這個設計中,幾個作者可能在一篇文章上進行協作,並且每篇文章的份額都可以分別給出一個單獨的費率。在其他一些提議的設計中這是不可能的。

也可以將同一文章出售給多個出版物。如果現實世界施加相同的約束,那麼可能需要對數據施加約束。

無論如何,如果你想要一個搜索字詞給谷歌,這個詞是「三元關係」。