0

A所以我有一个表(为简单起见,我们称之为),其中包含 4 个整数列( slot1, slot2, slot3, slot4)。这 4 个对应于不同表中的 ID(B与示例保持一致)。

我需要从 中的相应行中提取数据B,但在这里我遇到了问题。我正在尝试使用where()如下方法获取 4 个插槽:

@a_item = A.where("publish_at <= ?", DateTime.now).last
@slots = B.where(:id => [@a_item.slot1, @a_item.slot2, @a_item.slot3, @a_item.slot4]) if @a_item != nil

但是,当然,插槽的顺序在我返回的内容中不会保持不变,它是按B对象的 ID 排序的。

因此,这样做的一种肮脏方式是单独获取所有 4 个项目,但在此之前,是否有更好的方法来执行此操作或可能构建关系?

谢谢!

4

1 回答 1

1
@a_item = A.order(:published_at).last
ids = [@a_item.slot1, @a_item.slot2, @a_item.slot3, @a_item.slot4] unless @a_item.nil?
@slots = B.find(ids) unless ids.nil?
results = ids.map { |id| @slots.detect { |slot| slot.id == id } }

我会让你添加其余的弹性检查和故障保护,以防在你期望的地方没有返回任何东西。

于 2012-11-27T03:24:48.210 回答