0

我第一次使用Rails組合鍵,即使我已經閱讀了文檔,但我仍然不確定如何正確設置模型。Rails組合鍵 - 設置模型和關聯

活動可以由提供者安排。我想要一個連接表,將activity_idprovider_id作爲唯一的組合鍵,以便我可以將它與其他(價格)關聯起來。創建新計劃時需要生成組合。提供者不一定直接擁有自己的活動。

我已經得到了這個我的複合鍵,因爲它是自己的模型。這是正確的嗎?

class ScheduledActivity < ActiveRecord::Base 
    self.primary_keys = :provider_id, :activity_id 
    belongs_to :activity 
    belongs_to :provider 
    has_many :schedules, :foreign_key => [:provider_id, :activity_id] 
    has_many :prices, :foreign_key => [:provider_id, :activity_id] 
end 

這爲DB遷移:

class CreateJoinTableScheduledActivities < ActiveRecord::Migration 
    def change 
    create_join_table :providers, :activities, table_name: :scheduled_activities do |t| 
     t.index [:provider_id, :activity_id] 
    end 
    end 
end 

我如何再拿到聯結表中新條目,在創建時間表?我是否只在該模型上放置了belongs_to :scheduled_activity - 即Schedule表上沒有提供者和活動ID,並且是否要編寫單獨的掛鉤以創建新的組合鍵?

(另 - 這個正確的使用情況下,是擺在首位組合鍵?)

提前感謝!

回答

0

嗯,我不確定這是否完全回答你的問題,但如果你有一個複合獨特的關鍵,你可以做類似下面的事情。

在遷移:

add_index :scheduled_activities, [:provider_id, :activity_id], unique: true 

在你加盟模式:

belongs_to :activity 
belongs_to :provider 

validates :activity, presence: true, uniqueness: { scope: :provider } 

考慮到這是不是一個簡單的連接表更也許你應該考慮使用的ID來識別每個ScheduledActivity,那麼你可以簡單地將該參考添加到您的計劃模型/表中(計劃belongs_to :schedule_activity - 計劃表將引用具有屬性schedule_activity_id的計劃活動,而不是使用組合鍵)。它會使事情變得簡單和高效。