如何建立不同的标准?

时间:2009-08-04 20:22:11

标签: ruby-on-rails

我需要能够根据不同的标准和地点将潜在的所有者与被遗弃的动物相匹配。

所有者将设置特定条件。动物类型=“狗”,品种=“拉布拉多猎犬”,年龄需要在1到5之间,性别=男性,依此类推......

动物也会有特定的标准。动物类型=“狗”,年龄= 3,性别=男性,品种=“吉娃娃”。

动物也可能是:type =“Cat”,年龄=“12”,性别=女性,品种=“老虎”。

我还拥有所有者和动物(多态)的“位置”模型,其中包含与动物或所有者的位置相关的信息。

这部分很容易......

困难的部分(至少对我来说)是我需要为不同的动物类型指定不同的标准。因此,类型=“狗”的动物可能具有“可以获取?”的标准。而猫类动物可能会有“去爪”的标准吗?并且“鱼”类型的动物可能具有“模式”的标准,具有[“斑点”,“条纹”,“普通”]的多种选项。

我现在拥有的是具有通用动物信息(年龄,性别,品种)的“动物”模型,然后我有一个品种模型​​,每种动物类型有各种品种,但我无法弄清楚如何抽象出了动物类型不同的标准。

同样,这只是一个类比,因为我不认为我的实际问题会对任何其他人有任何意义。我需要的只是正确方向的一些指示,也许是一两个链接。我似乎无法弄清楚如何在Rails中实现这一点而不为每个标准集创建一个单独的表,如dog_criteria,cat_criteria,fish_criteria等等......

3 个答案:

答案 0 :(得分:1)

有时我们会为这些属性使用简单的名称/值对(或名称/值/类型三元组)。这节省了为世界上每种动物物种添加新类型(和数据库表)的过程。或者更糟糕的是每个品种:考虑一下贵宾犬......他们可能有一个额外的领域“装饰性地剃光”......和圣伯纳德,白兰地能力......

答案 1 :(得分:0)

在软件建模领域,显然可以用每个物种的类来完成,I.E。 “狗”,“猫”,“鱼”延伸“动物”。在关系数据库世界中,这变得有点难以表示。

如果你想在你的数据库中匹配这种面向对象的方法,你会得到一个“动物”表,然后是每个物种的表,“猫”,“狗”和“鱼”。然后你可能会有一个物种表(或代码中的硬编码枚举),它会给你一个值放置在Animal行中,每个动物都是动物种类。这将告诉您如何查找每只动物的更多信息。

这可能不是最好的方法。你所拥有的就是我为每只动物所称的“自定义数据”。您应该定义一个包含自定义属性列表的表,另一个表将这些属性与每个动物行的值相匹配。

如果您想更方便地查看和控制哪些属性可以应用于哪些物种,您可以为“类别”制作第三个表格,该表格将链接到动物物种和属性集合。然后,您将在动物行上指定类别ID。

示例表:

Animals
-------
ID
Age
Sex
Species
Breed

Parameters
----------
ID
Name

Parameter Values
----------------
ParameterID
AnimalID
Value

Categories (optional - add CategoryID to animals)
---------------------
ID
Name

Category Parameters
-------------------
CategoryID
ParameterID

答案 2 :(得分:0)

名值对解决方案可以在数据库中完成。

在这个例子中有4个表,人,要求,宠物,petstat

人和宠物每个都有一个id和一个名字 每个人也有一个或多个要求。要求具有名称,比较和值 每只宠物都有一个或多个PetStats,其中包含名称和值

通过这种设置,可以找到短头发的狗,例如:

select * from pet, petstat
where pet.id = petstat.petId
 and petstat.name = 'hair'
 and petstat.value = 'short'
 and petId in (select petId from petstat
   where name='type' and value = 'dog')

当宠物满足所有人的要求时,以下查询会将人与宠物匹配。

select person.name, pet.name from person, pet 
where (select count(*) from requirement where requirement.personid = person.id)
 = (select  count(*) from requirement, petstat
    where requirement.comparison = 'eq' 
     and requirement.name = petstat.name
     and requirement.value = petstat.value
     and requirement.personId = person.id
     and petstat.petid = pet.id)
 + (select  count(*) from requirement, petstat
    where requirement.comparison = 'lt' 
     and requirement.name = petstat.name
     and requirement.value > petstat.value
     and requirement.personId = person.id
     and petstat.petid = pet.id)
 + (select  count(*) from requirement, petstat
    where requirement.comparison = 'gt' 
     and requirement.name = petstat.name
     and requirement.value < petstat.value
     and requirement.personId = person.id
     and petstat.petid = pet.id);

通过在需求和petstat表中添加数字字段并向查询添加更多部分,可以更好地处理小于和大于比较,但这可以提供良好的统计数据。

以下是用于创建测试数据的插入内容。

delete from person;
insert into person (id, name) values (1, 'Joe');
insert into person (id, name) values (2, 'Bill');
insert into person (id, name) values (3, 'Erik');
insert into person (id, name) values (4, 'Mike');

delete from pet;
insert into pet (id, name) values (1, 'spot');
insert into pet (id, name) values (2, 'mittens');
insert into pet (id, name) values (3, 'rover');

delete from requirement;
insert into requirement (personid, name, comparison, value) values (1, 'type', 'eq', 'dog');
insert into requirement (personid, name, comparison, value) values (1, 'color', 'eq', 'black');
insert into requirement (personid, name, comparison, value) values (2, 'type', 'eq', 'fish');
insert into requirement (personid, name, comparison, value) values (3, 'type', 'eq', 'dog');
insert into requirement (personid, name, comparison, value) values (3, 'hair', 'eq', 'long');

insert into requirement (personid, name, comparison, value) values (4, 'type', 'eq', 'dog');
insert into requirement (personid, name, comparison, value) values (4, 'weight', 'lt', '30');
insert into requirement (personid, name, comparison, value) values (4, 'weight', 'gt', '20');

delete from petstat;
insert into petstat (petId, name, value) values (1, 'type', 'dog');
insert into petstat (petId, name, value) values (1, 'color', 'black');
insert into petstat (petId, name, value) values (1, 'hair', 'short');
insert into petstat (petId, name, value) values (2, 'type', 'cat');

insert into petstat (petId, name, value) values (3, 'type', 'dog');
insert into petstat (petId, name, value) values (3, 'weight', '25');
insert into petstat (petId, name, value) values (3, 'color', 'brown');