所以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
任何想法?
答案 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_a
和refresh
以及其他令人感到困惑和不愉快的事情。
这需要修复,我将在完成驱动程序重写(一个名为Crunch的相关项目)后立即修复。在短期内,Candy最好被视为冒险的实验,我不能保证它会节省时间,直到界面被锁定好一点。对不起,我很抱歉。