簡體   English   中英

Rails協會的術語:屬於和has_many

[英]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)

polymorphic

#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM