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 根據條件獲取金融產品資料 ...