使用Rails自定义外键

时间:2015-12-22 03:10:55

标签: ruby-on-rails

我有两张表如下:

+-----+
Software
+-----+
id
name
latest_version [Field that needs to be implemented]


+-----+
Versions
+-----+
id
version_string
released_date

我在has_many :versions模型中定义了Software,在belongs_to :software模型中定义了Version来关联它们。

现在,问题是我需要根据发布的日期获取最新版本,并在Software表中存储另一个引用以便更快地查找。那么,如何使latest_version列使用Rails引用Version表中的单行?或者这是一种不好的做法?

更新:我已在版本模型中设置了命名范围latest_version以获取最新版本。但是,如果应用程序扩展(我认为)

,我认为这不是更好的选择

2 个答案:

答案 0 :(得分:3)

我认为将字段名称更改为latest_version_id在语义上是正确的。

然后你可以实现类似的东西。

has_one :latest_version, class_name: "Version", foreign_key: "latest_version_id"

或使用范围(不确定如何实现)

has_one :latest_version, -> { order 'created_at' }, class_name: "Version"

答案 1 :(得分:1)

你可以按照Ryan Bate's railscast episode on model caching中的描述尝试缓存。它的要点是你可以将latest_version_id作为缓存存储在内存中,而不必创建另一个列,或者每次加载模型时都查询数据库。

您需要查询数据库以获取最新版本的唯一时间是

1)第一次当你缓存latest_version_id时,

2)缓存过期时,或

3)当有新版本或

4)更新版本时(错误发布日期中有人键)。

对于3和4,Ryan使用after_save回调手动使缓存失效。之后会发生的是应用程序将加载并实现没有cache_version_id的缓存,因此它将使用您的scope方法查询数据库。这样做会再次填充缓存,下次需要再次加载最新版本时,它不会查询数据库。