2014-08-31 38 views
0

我有兩個類Productuser,它們與多態類型具有has_many關係。Ruby on Rails名爲model屬性的類型

class User < ActiveRecord::Base 
    has_many :pictures, as: :imageable 
end 

class Product < ActiveRecord::Base 
    has_many :pictures, as: :imageable 
end 

class Picture < ActiveRecord::Base 
    belongs_to :imageable, polymorphic: true 
end 

我想也是一個新的屬性添加到profile_picture所以@user.profile_picture用戶模型將返回一個圖片對象。這怎麼能實現呢?特別是向用戶添加外鍵的遷移。

編輯:我已經更新了用戶模型作爲這樣

has_one :profile_picture, class_name: "Picture", foreign_key: "profile_picture_id" 

,並添加以下遷移

add_column :users, :profile_picture_id, :integer 

但我不似乎能夠將情景模式設置畫面,如果有人可以解釋我正在做錯什麼,將不勝感激。謝謝!

+0

http://guides.rubyonrails.org/association_basics.html#polymorphic-associations – 2014-08-31 20:40:35

+0

伊夫回顧了聯繫,從我目前的polymophic協會來。我不明白的是如何添加新的屬性到用戶模型,這將是類型的圖片。 – user3576112 2014-08-31 20:43:06

+0

'has_one:picture,as :: profile_picture' – 2014-08-31 20:43:57

回答

0

有使用關聯時正確地實現這個沒有直接方式。

數據結構錯誤。您正嘗試以以兩種不同方式關聯一個模型和相同模型。而問題是:這兩種方式互相干擾

您正在有效嘗試使用相同類型存儲不同類型的對象。直接的方式(在另一個答案中建議)會讓你無法確定哪些是簡單的User的圖片,其中的profile_picture是什麼。因此,任何可能的解決方案都需要添加一種方法來區分profile_picture

就在昨天我寫了an example on how to use "single table inheritance"。它實際上很適合這裏,你需要兩個相似的數據結構以不同的方式表現。爲了使它的工作,你需要兩樣東西:

  1. 加入STI支持pictures表:
    rails g migration AddTypeToPictures type:string:index
    ...,並確保你與它添加索引stringtype列。

  2. rails g model ProfilePicture --no-migration --parent=Picture
    這個類將被創建爲空,但會從Picture繼承一切,所以應該在很多情況下留空。

然後,只需一個簡單的關聯應該在任何類工作:

has_one :profile_picture, as: :imageable 

假設我們加入這User。那麼搜索條件來查找User的個人資料圖片將是:

  • type"ProfilePicture"
  • imageable_type
  • imageable_id等於用戶的id問題

搜索已變得繁瑣,對嗎?那麼,這應該工作,但是我不建議這一切,它影響和替代方案:

  • 無論數據庫列決定要添加到ProfilePicture,它會被添加到Picture即使它不是使用:它們存儲在同一個表中。
    解決方案:製作ProfilePicture一個完整的模型:爲它做一個表,使它繼承ActiveRecord::Base
  • 獲取用戶的個人資料圖片需要使用三個(哇!)不同的標準進行額外的數據庫查詢。
    解決方案(推薦):將配置文件圖片放置在相應的模型中,方法與Picture相同:無需額外查詢即可獲取配置文件圖片。
1
class User < ActiveRecord::Base 
    has_many :pictures 
    has_one :profile_picture, :class_name => "Picture" 
end 

class Product < ActiveRecord::Base 
    has_many :pictures 
end 

class Picture < ActiveRecord::Base 
    belongs_to :imageable, polymorphic: true 
end 
+0

我想知道應該如何工作。據我所知 - 不應該,在用戶的所有「圖片」中,沒有辦法選擇確切的'profile_picture'。沒有這方面的數據。 – 2014-08-31 20:45:55

+0

mybe我誤解了這個問題...它不是很好寫...:\ 它應該工作,如果用戶有外鍵圖片 – Dima 2014-08-31 20:46:46

+0

謝謝我可以看到如何添加一個新的有一個屬​​性的用戶類將工作,如何可以映射到數據庫中的用戶表。更新的問題希望更清楚 – user3576112 2014-08-31 21:01:21

相關問題