0

是否有可能与 DataMapper 创建条件关联?

例如:

我希望用户拥有 n 个应用程序,只要该用户具有该属性:developer => true

像这样的东西:

class User
  include DataMapper::Resource
  property :id, Serial
  property :name, String, :nullable => false
  property :screen_name, String, :nullable => false, :unique => true
  property :email, String, :nullable => false, :unique => true, :format => :email_address
  property :password, BCryptHash, :nullable => false
  property :developer, Boolean, :default => false

  #The user just gets apps if developer
  has n :apps #,:conditions => "developer = 't'"

end

class App
  include DataMapper::Resource
  property :id, Serial
  property :name, String, :nullable => false

  belongs_to :user
end

我知道这可以通过从 User 创建一个子类作为 Developer::User 并在该类中使用has n,但我真的很想知道是否可以直接在关联声明中创建它。

我在使用 ARn 时还设法做的另一种方法是扩展关联并重写每个操作的方法。

所以在扩展模块上我可以有这样的东西:

module PreventDeveloperActions
  def new
    if proxy_owner.developer?
       super
    else
       raise NoMethodError, "Only Developers can create new applications"
    end
  end

 # and so on for all the actions ...
end

但是,如果可能的话,我真的很想避免使用这种解决方案,但前提是可以使用 DataMapper 轻松执行快速直接的方法:)

提前致谢

4

1 回答 1

2

目前,您在关系声明中包含的条件仅适用于目标。所以如果目标模型有一个 :active 属性,你可以说类似has n, :apps, :active => true. 不幸的是,您无法定义仅在给定源的当前状态时才处于活动状态的关系(目前)。

我正在考虑一些建议来扩展 DM 中的查询逻辑,但我不确定这将对代码产生什么影响,以及除此之外它将提供哪些额外功能。这可能是我们在 DM 1.0 之后解决的问题,因为它也会影响 50 多个适配器和插件。

STI 通常是我推荐的,因为它允许您定义仅存在于该类型对象的关系。另一种方法是将关系定义为正常,将访问器/修改器方法标记为私有,然后添加一个代理方法,它相当于return apps if developer?.

于 2009-11-30T06:54:59.823 回答