2010-01-22 50 views
0

我正在研究一个允许用户将图像与特定事件相关联的应用程序。事件由用户拥有。简单的解决方案当然是:Rails数据建模 - 交替到has_many:通过,给定多态?

 
class Image < ActiveRecord::Base 
    belongs_to :event 
end 

class Event < ActiveRecord::Base 
    has_many :images 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    has_many :events 
    has_many :images, :through => :events 
end 

除了!有一个问题。我还希望我的用户能够直接拥有图像,而无需中间事件。如果我在这里使用“常规”多态关联,那么显然user.images将无法​​正常工作。我是否应该握住我的鼻子,使用:as => :event_images来消除歧义,并定义user.all_images是否需要这种需求?我是否应该拥有由用户直接拥有的所有图像,并且可以选择与某些事件相关联? (当然,有一个验证来确保一致性......但这看起来有点臭。)有没有第三种解决方案比这两种方法都更漂亮?

回答

0

我经常发现忘记ActiveRecord DSL并在定义复杂关系时直接使用数据模型很有用。一旦数据模型正确,您可以将其映射到模型语句中。

从您的问题中可以看出,如果图像可以由用户拥有一个事件,如果它们可以同时归于两者,则不太清楚。该问题将决定您使用的数据模型。

如果图像可以通过两者所拥有,图像表将需要一个参考两者USER_ID的event_id,这可能需要根据你的用例为可以为空(用户或事件是可选的关系)。如果图片只能由一个拥有,您可以设置某种多态拥有关系,将所有者映射到正确的所有者表(owner_id,owner_type etc等)。

假设它可以同时属于:

class Image < ActiveRecord::Base 
    belongs_to :event 
    belongs_to :user 
end 

class Event < ActiveRecord::Base 
    has_many :images 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    has_many :events 
    has_many :images 
    has_many :event_images, :through => :events, :class_name => "Image" 
end