有可能创建与DataMapper的条件关联吗?
例如:
如果用户具有属性: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轻松地执行快速直接的方法:)
提前致谢
答案 0 :(得分:2)
目前,您在关系声明中包含的条件仅适用于目标。因此,如果目标模型具有:active属性,则可以说has n, :apps, :active => true
之类的内容。遗憾的是,您无法定义仅在源(当前)状态下仍处于活动状态的关系。
我正在考虑在DM中扩展查询逻辑,但我不确定对代码会产生什么影响,除此之外还会提供哪些额外功能。这可能是我们在DM 1.0之后解决的问题,因为它也会影响50多个适配器和插件。
STI通常是我推荐的类似内容,因为它允许您定义仅存在于该类型对象的关系。另一种方法是将关系定义为正常,将accessor / mutator方法标记为私有,然后添加一个等效于return apps if developer?
的代理方法。