8

我目前正在使用(或尝试使用)查找表来表示包含枚举字符串的列。我已经与我的团队进行了广泛的讨论,以确保这是我们想要去的方向,并决定追求它,但不幸的是,我们都不知道如何使用迁移将查找表绑定到列,以及是否有更改在模型/控制器/视图中进行以支持这种新行为。

我已经在谷歌上广泛搜索了这个并且没有找到这样做的好例子,所以我希望有人可以告诉我一个很好的链接到我刚刚在搜索中错过的教程,或者描述如何做到这一点。我也很想知道这是否有非官方(或官方)的 Railsy 模式。

提前致谢。

4

3 回答 3

5

如果您正在寻找一种无需创建单独的表即可对枚举/配置进行建模的轻量级方法,请务必查看 ActiveHash:

https://github.com/zilkey/active_hash

于 2011-01-28T18:11:11.147 回答
3

我遇到了和你一样的问题,并通过创建一个将动态查找表透明地添加到模型中的 gem 来解决它。我在这里写过博客:http: //www.codelord.net/2011/08/09/guest-post-lookup-tables-with-ruby-on-rails/

代码在这里:https ://github.com/Nimster/RailsLookup

于 2011-08-10T13:35:17.783 回答
1

我知道这是一个老问题,但由于它仍然是谷歌的热门话题,我想我会分享我的解决方案,它被打包成一个 gem。看看 https://github.com/blackrat/acts_as_enumeration

从自述文件:

因此,如果一个数据库表有一个名为“name”的列,则声明

act_as_enumeration :名称

将选择该列中的所有项目并将它们映射到它们的主键值。

此外,它创建实例方法 is_#{key} ,其中 key 是该列中的所有值,is?(array) 和 is_not?(array) 检查该数组中的类型。

保持 name 作为我们的列示例,类方法 id_for_name 将返回该映射的主键值,valid_name?(value) 将说明表是否包含该值并在 name 列中的条目。

最后,缺少的方法允许 is_ 和 is_not 链接方法,例如 is_paul_or_michael_or_luke? 与 (is_paul? || is_michael?|| is_luke?) 或 is?(:paul, :michael, :luke) 和 is_not_paul_or_michael_or_like 具有相同的效果,与 !(is_paul || is_michael?|| is_luke? ) 或 !is?(:paul, :michael, :luke)

CAVEAT:由于 method_missing 使用的机制,如果某人实际上有名称“not bruce”,则组合查询不能将其用作第一个元素。即“不是”不仅仅是“不是布鲁斯”。

所以is_not_bruce_or_paul的组合?必须写成 is_paul_or_not_bruce?达到预期的效果。is_not_not_bruce_or_paul 很好,但发生这种情况的可能性与在 Monty Python 草图之外实际称为“not bruce”的人差不多。

(这意味着它可能会,所以在您更改代码以支持新条目之前,请尝试更改顺序)

于 2021-04-27T11:18:11.057 回答