0

我已經制定了以下關聯:Ruby on Rails的3多個關聯

class User < ActiveRecord::Base 
    has_many :shopping_requests 
    has_many :recommendations, :through => :shopping_requests 
end 


class ShoppingRequest < ActiveRecord::Base 
    belongs_to :user 
    has_many :recommendations 
end 


class Recommendation < ActiveRecord::Base 
    belongs_to :shopping_request 
    has_one :user, :through => :shopping_requests 
end 

現在我需要添加恭維類。用戶可以讚揚另一個用戶(所以我有一個user_from_id和一個user_to_id)。可以爲購物請求和/或推薦提供讚美;並且沒有限制(用戶可以得到同一用戶或其他用戶對任何數量的購物請求以及推薦的多種讚美)。

我知道讓讚美多態性,但不知道什麼是將其設置在相對於用戶/購物請求/推薦的最佳途徑。

我希望能夠像這樣運行查詢:

  • user_to_id.compliments(以獲得該用戶的所有的讚美);
  • user_to_id.shopping_request.compliments(以獲得該用戶的所有讚美特定的購物請求;
  • user_to_id.recommendation.compliments(以獲得該用戶的所有讚美的具體建議;對於這類查詢,運行user_to_id.shopping_request .recommendation.compliments是細太);
  • user_from_id.compliments(讓所有的用戶給了另一個致意);
  • user_from_id.shopping_request.compliments(得到這個用戶的特定shopping_request給出的所有讚美)等...

那麼,爲Compliment類設置關聯的最佳方式是什麼?

回答

1

這是我的第一次鞦韆。您已經編寫的代碼有效,我沒有在這裏複製。

class User < ActiveRecord::Base 
    ... 
    has_many :outgoing_compliments, class_name: "Compliment", foreign_key: "from_id" 
    has_many :incoming_request_compliments, through: :shopping_requests, source: compliments 
    has_many :incoming_recommendation_compliments, through: :recommendations, source: compliments 
    ... 
end 


class ShoppingRequest < ActiveRecord::Base 
    ... 
    has_many compliments, as: :compliment able 
    ... 
end 


class Recommendation < ActiveRecord::Base 
    ... 
    has_many compliments, as: :complimentable 
    ... 
end 

class Compliment < ActiveRecord::Base 
    belongs_to :complimentable, polymorphic: true 
    #relies on two DB columns, complimentable_id and complimentable_type 

    belongs_to :complimenter, class_name: "User", foreign_key: "from_id" 
end 

我按照你的定義對數據庫做了一個改動。恭維知道它屬於哪個Complimentable,並且由於每個Complimentable知道它的用戶,保存補充的用戶是多餘的。你可以選擇添加行...

class Compliment 
    belongs_to :complimented, class_name: "User", foreign_key: "from_id" 

class User 
    has_many :incoming_compliments, class_name: "Compliment", foreign_key: "to_id" 

...但我不認爲我會。

這些是您需要創建的關聯。但是,您希望的一些方法調用不夠具體。舉個例子:

user_to_id.shopping_request.compliments(以獲得該用戶的所有 恭維特定購物請求;

因爲你寫的是用戶實例方法,我們可以假設用戶是已知的。然而,由於用戶可以有很多 ShoppingRequests,這是不可能的,通過你寫什麼,磨練顯示讚美爲一個特定的請求。