rails中的模型關聯(高階篇)

2021-07-15 14:42:10 字數 4278 閱讀 3929

rails中的模型關聯(高階篇)

總結了一些 rails 模型關聯,有些可能不是很常見,但是會很有用,在這裡和大家分享一下。

1. has_many :through

has_many 的用法大家可能都很熟悉,但是後面跟乙個 `:through` 呢? has_many :through 通常表示兩個模型之間的多對多的關係是通過(through)另外乙個 model 關聯起來的,舉個例子:乙個男孩兒可以通過約會交往多個女孩兒,同時乙個女孩兒可以通過約會交往多個男孩兒,相關的`model`**如下:

class

boy< activerecord::base

endclass

< activerecord::base

belongs_to :boy

belongs_to :girl

endclass

girl

< activerecord::base

end

rails

gscaffold

boyname

:string

age:integer

rails

gscaffold

girl

name

:string

age:integer

rails

gmodel

boy_id

:integer

girl_id

:integer

content

:string

has_many :through還可以簡化巢狀的關聯關係,舉個例子:某公司有多名開發(developer),每個開發有多次的加班(extra_work),可能你想知道某公司有多少的加班,你應該這樣做:

class

company

< activerecord::base

has_many :developers

has_many :extra_works, :through => :developers

endclass

developer

< activerecord::base

belongs_to :company

has_many :extra_works

endclass

extrawork

< activerecord::base

belongs_to :developer

belongs_to :company

end

[email protected]

_works.count 了。

2. has_one :through

通過上面介紹的 has_many :through,你應該很容易了解 has_one :through 的適用場景和使用方法了。需要注意的是資料庫模型 id 的宣告。

3. has_and_belongs_to

has_and_belongs_to 直接建立兩個 model 的多對多關係,不需要中間 model,舉個例子:一名開發(developer)可以有多個專案(project),乙個專案可以有多個開發

class

developer

< activerecord::base

has_and_belongs_to_many :projects

endclass

project

< activerecord::base

has_and_belongs_to_many :developers

end

注:這種宣告關係需要在資料庫中建立中間表

4. 誰應該 has_one? 誰應該 belongs_to?

當你想建立乙個一對一的關係時,你需要在他們的 model 上分別宣告 has_one 和 belongs_to,那麼誰應該 has_one,誰應該 belongs_to 呢?這要看 外來鍵 的位置,而且你需要考慮到這兩個 model 的實際意義,比如說:「每個公民都有且只有乙個身份證」要比「每個身份證都有乙個公民」更符合實際。

class

citizen

< activerecord::base

has_one :card

endclass

card

< activerecord::base

belongs_to :citizen

end

正確的migration應該是這樣

class

createcitizens

< activerecord::migration

defchange

create_table :citizens

do |t|

t.string :name

t.timestamps

endcreate_table :cards

do |t|

t.integer :citizen_id

t.string :card_number

t.timestamps

endendend

在當前版本的 rails 中,t.integer 那一行應該用 t.references :citizen 代替。

5. has_many :through 還是 has_and_belongs_to_many?

6. 多型關係

rails model 還有一種比較「繞」的關係,我把它翻譯為「多型關係」,通過多型關係,乙個 model 可以通過乙個關係 belongs_to 多個 model,舉個例子:你有乙個 picture model,它 belongs_to employee 或者 product,你應該做如下宣告:

class

picture

< activerecord::base

belongs_to :imageable, :polymorphic => true

endclass

employee

< activerecord::base

has_many :pictures, :as => :imageable

endclass

product

< activerecord::base

has_many :pictures, :as => :imageable

end

class

createpictures

< activerecord::migration

defchange

create_table :pictures

do |t|

t.string :name

t.integer :imageable_id

t.string :imageable_type

t.timestamps

endendend

有乙個更簡單的方法,那就是使用 t.references 和 polymorphic

class

createpictures

< activerecord::migration

defchange

create_table :pictures

do |t|

t.string :name

t.references :imageable, :polymorphic => true

t.timestamps

endendend

7. 自鏈結

在設計乙個資料模型的時候,你有時可能需要找到乙個 model 對它自己的關係,舉個例子:你想要在乙個資料庫模型中儲存所有的員工,但是你還想在這裡宣告:高管,低階人員等,你可以這麼做:

class

employee

< activerecord::base

has_many :subordinates, :class_name => "employee",

:foreign_key => "manager_id"

belongs_to :manager, :class_name => "employee"

end

這樣你就可以使用 @employee.subordinates和 @employee.manager了。

關於 rails 的模型關聯先說到這裡,我們下期再見

rails 在view中引用關聯model值

今天遇到乙個問題。情景是這樣的,有一張表invite和一張group表。group跟invite是一對多關係即 group.rb has many invites invite.rb belongs to group 在建立invite的時候需要同時新增其屬於那個group,這是我就蛋疼了。於是上網...

215 Rails 3 中的高階查詢

size x large 用類方法代替scopes size 在我們要來展示的應用程式中包括兩個模型 product 和 category,其中,product屬於category,並且在product模型中有乙個named scope discontinued,用來表示已經停產和價錢低於乙個給定的...

TP中關聯模型的使用

class bfinanceproduct extends common desc 屬性 屬性值 public function attrvalue 金融型別 public function type param where param string field desc 根據條件獲取金融產品資料 ...