[英]Rails Association Terminology: Belongs_to and has_many
我有兩個關於ActiveRecords的問題:
1)
假設我有一個包含多個用戶的應用程序,每個用戶都有一張個人資料照片。
我希望用戶能夠與朋友擁有相同的個人資料照片:這導致了一對多的關系,其中一張照片可以成為許多用戶的個人資料照片。
當我必須在rails中創建關聯時,我必須編寫如下內容:
class User < ActiveRecord::Base
belongs_to :photo
end
class Photo < ActiveRecord::Base
has_many :Users
end
現在這對我來說有點奇怪,因為在這種情況下照片屬於多個用戶,而不是同一張照片屬於多個用戶。
我做錯了還是我對rails的術語有過多的思考?
2)
新案例:
假設一個用戶可以擁有一張個人資料照片。 在這種情況下,照片無法在用戶之間共享,因此關系是一對一的。
我還想添加一個可以包含照片的帖子實體,並且該照片可以由用戶用作個人資料照片。
這是最終實現的樣子:
class User < ActiveRecord::Base
has_one :photo
end
class Photo < ActiveRecord::Base
belongs_to :user
belongs_to :post
end
class Post < ActiveRecord::Base
has_one: Photo
end
通過查看Rails文檔 ,似乎這樣創建一對一關系的唯一方法是將兩個外鍵放在Photo表中:一個用於Post,一個用於User。
但是,我想在User表中為Photo使用一個外鍵,在Post表中也為Photo使用一個外鍵。 在這種情況下,實現似乎需要這樣:
class User < ActiveRecord::Base
belongs_to :photo
end
class Photo < ActiveRecord::Base
has_one :user
has_one :post
end
class Post < ActiveRecord::Base
belongs_to: Photo
end
從語義上來講,這對我也沒有多大意義。 再說一次,我是在做錯什么還是我在想這個嗎?
1)
#app/models/user.rb
class User < ActiveRecord::Base
has_one :photo
belongs_to :avatar, class_name: "Photo" #-> set this as the "avatar"
end
#app/models/photo.rb
class Photo < ActiveRecord::Base
belongs_to :user
end
user
可以創建照片; 他可以定義自己使用的avatar
:
@user = User.find x
@photo = @user.avatar
雖然我仍然認為它看起來有些怪異,但我認為它會起作用。
2)
#app/models/post.rb
class Post < ActiveRecord::Base
belongs_to :user
has_one :photo, as: :imageable
end
#app/models/user.rb
class User < ActiveRecord::Base
has_many :posts
has_one :photo, as: :imageable
belongs_to :avatar, class_name: "Photo"
end
#app/models/photo.rb
class Photo < ActiveRecord::Base
belongs_to :imageable, polymorphic: true #-> belongs to either post or user
end
在這兩種情況下,我都主張使用foreign_key
為用戶定義avatar_id
。
這將意味着一個belongs_to
關聯(不理想),但意味着您可以上傳任意數量的圖像,並將其中一個作為頭像。 然后,您可以根據需要在個人資料中調用avatar
方法。
做到這一點的最佳方法是使用join table
/ join model
但這對於您的要求而言效率很低。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.