DataMapper有条件的n

时间:2009-11-25 00:11:00

标签: ruby conditional associations one-to-many datamapper

有可能创建与DataMapper的条件关联吗?

例如:

如果用户具有属性:developer => true

,我希望用户拥有n个应用

类似的东西:

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轻松地执行快速直接的方法:)

提前致谢

1 个答案:

答案 0 :(得分:2)

目前,您在关系声明中包含的条件仅适用于目标。因此,如果目标模型具有:active属性,则可以说has n, :apps, :active => true之类的内容。遗憾的是,您无法定义仅在源(当前)状态下仍处于活动状态的关系。

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

STI通常是我推荐的类似内容,因为它允许您定义仅存在于该类型对象的关系。另一种方法是将关系定义为正常,将accessor / mutator方法标记为私有,然后添加一个等效于return apps if developer?的代理方法。