2011-07-10 140 views
0

我有一个模型调用大约60列的权限,其中一半的列表示一个布尔值,一半表示一个文本(:字符串)字段。比较模型Ruby on Rails

我想能够比较这个模型的2个不同的对象。

的比较将能够与其它物体的等效列相比呈现第一对象的ONLY值。 忘记包含或不包含文本的值!

例如:

对象1:

Permission: 
    Read_disk :true 
    Write_disk :true 
    Modify_disk :true 
    Delete_disk :true 
    Every other permission FALSE or TEXT so I do not care about them. 

对象2:

Permission: 
    Read_disk :false  (*I care about that because it was true in object 1) 
    Write_disk :false (*I care about that because it was true in object 1) 
    Modify_disk :true (*I care about that because it was true in object 1) 
    Delete_disk :true (*I care about that because it was true in object 1) 
    Every other might be TRUE or FALSE or TEXT but I do not care about them because those permissions were false in the object 1 

我认为我想目前这种比较仅示出了真对象1及其等效字段对象2

有什么建议吗?

谢谢。

回答

1
class Permissions < ActiveRecord::Base 
    def compare(permission) 
    true_attributes = self.attributes.select{|k, v| v==true } 
    equivalent_attributes = permission.attributes.select{|k, v| true_attributes.key?(k) } 

    [true_attributes, equivalent_attributes] 
    end 
end 

object_1_permissions, object_2_permissions = object_1.compare(object_2) 
+0

但是最后我想返回2个对象。一个对象具有对象1的真实值。另一个具有与对象2的真实值相同的值。 – glarkou

+0

这就是它的作用。 'object_1_permissions'现在具有Object 1的真实属性,'object_2_permissions'现在具有相同属性的值。 – gunn

+0

您正在开玩笑:p' object_1_permissions,object_2_permissions = object_1.compare(object_2)'这条线是否会做所有的魔法?你能解释一下吗?因为我是Rails新手? – glarkou

1

如果我正确理解您的问题,您希望能够查找与另一个记录相关的Object的记录。这不是太难

obj = Object.find(some_id) 
conditions = Hash.new 
obj.attributes.each do |key, value| 
    if value == true 
     conditions[key] = value 
    end 
end 
interestingObjects = Object.where(conditions).all 

然后你的interestingObjects将有你想要的记录!

+0

谢谢队友。我认为这是正确的。我以前的评论:我不关心对象1的虚假属性。只有真的。另外,我不关心对象1中的属性是否与对象2中的属性相同。我只关心对象1中的真实属性并返回2个对象。第一个对象将只是对象1的真实属性。对象2将等同于对象1的真实值。 – glarkou