Ruby,Candy和类似SQL的mongo东西

时间:2010-08-12 10:34:54

标签: ruby mongodb

所以Candy是一个非常简单的库,用于在Ruby中与Mongo进行交互。

我糟糕的SQL大脑正在努力弄清楚我应该如何解决这个问题:

user个,有thing个。每个thing由一个user生成,但应该可以访问所有user的子集(在thing中指定)。暂时不考虑user的规范,如何获得thing X 有权访问的所有user的列表?

class Thing
  include Candy::Piece
end

class Things
  include Candy::Collection
  collects :thing
end

我应该将允许的user分配给这样的thing吗? (我们暂时只使用字符串来引用user

t = Thing.new
t.allowed = ['X','Y','Z']

这对我来说似乎是正确的,这会让我想做:

Things.find(allowed:'X')

但它不太有用......

NoMethodError: undefined method ‘call’ for {:allowed=>"X"}:Hash

任何想法?

1 个答案:

答案 0 :(得分:1)

我真的很抱歉我花了很长时间才抓住这个并做出回应。这对你的目的来说可能为时已晚,但是:

Candy没有实现find方法。这是故意的:如果一个对象代表一个集合,那么每个访问都隐含地在该集合中找到的东西。这与没有save方法的原因相同。如果映射真的是透明的,则不需要表示“在数据库中执行此操作”的动词。

所以为了做你想做的事,你可以在创建时传递范围来创建一个新的Things对象:

x_is_allowed = Things.new(allowed: 'X')

...或者您可以保存一个步骤并按类方法执行:

x_is_allowed = Things.allowed('X')

...或者您可以从整个集合开始,稍后按属性限制它:

things = Things.new
x_is_allowed = things.allowed('X')

所以...嗯。所有这些都会奏效。 但是。我必须警告你,我现在对Candy的一般可用性以及特别是集合和数组字段非常满意。最大的问题是访问者:[]方法无法像您期望的那样工作,因此您最终不得不调用to_arefresh以及其他令人感到困惑和不愉快的事情。

这需要修复,我将在完成驱动程序重写(一个名为Crunch的相关项目)后立即修复。在短期内,Candy最好被视为冒险的实验,我不能保证它会节省时间,直到界面被锁定好一点。对不起,我很抱歉。