has_many:通过对象继承

时间:2011-03-12 04:28:35

标签: ruby-on-rails activerecord

我正在尝试创建一个应用程序,其中用户拥有许多项目,并且他们通过Possession拥有的每个项目本身就是一个实体。这背后的想法是,如果我有一个MacBook项目,例如,并且用户将其添加到他们的库存,他们可以应用属性(照片,评论,标签等)而不直接影响他们物品本身,只有他们的占有。 / p>

该项目将反过来从其相应的Possessions聚合属性(如果您要转到/ item / MacBook,而不是/ user / 101 / possession / 5)。我有以下模型设置(暂时忽略照片等属性)。

class User
    has_many :possessions
    has_many :items, :through => :possessions
end

class Item
    has_many :possessions
    has_many :users, :through => possessions
end

class Possession
    belongs_to :user
    belongs_to :item
end

我的第一个问题是,我是否正确行事。是has_many:通过正确的工具吗?

如果是这样,我将如何处理类继承呢?我可能没有说明这一点,但我的意思是,如果我要做类似

的事情
@possession = Possession.find(params[:id])
@photos = @possession.photos.all

并且没有可用的照片,它怎么会回到相应的项目并搜索属于它的照片?

1 个答案:

答案 0 :(得分:0)

您的初始数据结构似乎合适。

至于第二部分,对于相应的项目“退回”,我认为没有直接的Active Record方式来做到这一点。这种行为看起来非常具体,并且可能会让未来的开发人员感到困惑,除非您有明确的方法。

可以Possession内创建一个方法,如:

def photos_with_fallback
   return self.photos if self.photos.size > 0
   self.item.photos
end

这样做有很强烈的后果。如果您有这样的方法,那么您将无法在@photos.build@photos.create之下进行任何写作活动,因为您无法知道将它们放在何处。它们可以与ItemPosession

相关联

我认为您最好将条件逻辑推送到控制器并先检查Posession上的照片,然后再查看Item上的照片。

#In the controller
@photos = @posession.photos
@photos = @posession.item.photos if @photos.size == 0

当您稍后维护代码时,这将更加明确,并且它将允许您在未来做出其他决定。