datamapper:帐户有1个场所或者有1位艺术家

时间:2014-05-25 01:14:44

标签: ruby associations datamapper

好。我是DataMapper的新手。我一直在努力阅读文档并理解它与我几小时内想要完成的事情相关,但对于像我这样的ADD人来说,这真是太棒了。谷歌没有太多的帮助 - 也就是说,我不确定如何将我的问题复杂化为查询格式。所以我问这个问题是为了得到一个答案并能继续我的项目,但我也痴迷于想要绕过这个问题。如此。

所有注册的用户都会获得一个帐户。该帐户有一个用户名,电子邮件和密码字段,基本的东西。模型本身,即那些属性,工作正常(我理解那么多)。

但是,根据用户的识别方式,他们也可能是艺术家,场地或粉丝。由于这些标识的巨大差异,每个标识都有自己的模型。因此,当用户获得帐户时,他还需要插入艺术家,场地或粉丝模型。用户不能是其中两个,只能是一个。

我的问题是如何设置这种类型的关联。我在想has 1, :artist OR has 1, :venue OR has 1, :fan,但我不认为这是支持的。但是你明白了。

我也想过,好吧,f ***它,我只会给一个帐户n艺术家和n场地和n粉丝,但只插入一条记录到相关模型。但这似乎是一个糟糕的,臃肿的解决方法。

有没有正确的方法来做到这一点,或者至少是最好的方式?提前谢谢你,我希望我能很好地解释自己。

1 个答案:

答案 0 :(得分:0)

您的用户可以拥有与之相关的艺术家,地点或粉丝模型,因此您需要以下内容:

class User
  # ...
  has 1, :artist
  has 1, :venue
  has 1, :fan
  # ...
end

接下来,您的用户最多只能与艺术家,场地或粉丝相关联,因此您需要对这些模型进行一些额外的验证:

class Artist
  belongs_to :user
  validates_with_method :user_has_no_venue_or_fan
  def user_has_no_venue_or_fan
    if user.fan || user.venue
      [false, "Your custom error message..."]
    else
      true
    end
  end
end 

您将对FanVenue模型进行类似的验证。

通过这种方式,您的用户类可以与场地,粉丝或艺术家模型相关联,但这些模型上的验证将确保用户不会与多个模型相关联。

如果您想通过该用户轻松访问您的识别模型,您可以在用户中编写一个方法,如下所示:

class User
  def placeholder_method_name
    artist || venue || fan
  end
end