我有两张表如下:
+-----+
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
以获取最新版本。但是,如果应用程序扩展(我认为)
答案 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方法查询数据库。这样做会再次填充缓存,下次需要再次加载最新版本时,它不会查询数据库。