Rails 3:可以用连接表订购吗?

Posted

技术标签:

【中文标题】Rails 3:可以用连接表订购吗?【英文标题】:Rails 3: Possible to order with a junction-table? 【发布时间】:2012-11-29 17:05:50 【问题描述】:

我有一个嵌套表单,它为每个帖子创建许多位置。每个位置也可以在多个帖子中使用。

例如帖子 1 可能有 Location1、Location2 和 Location3

AND Post 2 可能有 Location1、Location4 和 Location5

我希望这些位置在帖子中的顺序与添加顺序相同。我假设最简单的方法是在连接表(Posts_Locations)中添加一个“订单”列,但是我不确定如何在我的控制器中设置或定义:order_by。我应该直接使用 SQL 执行此操作吗?

有什么建议吗?这是最好的方法吗?

【问题讨论】:

【参考方案1】:

如果您对 Post 和 Location 使用简单的连接表和 has_and_belongs_to_many,您可能希望将 posts_locations 表本身设为模型,并使用 has_many :through 连接两者。这很好地描述了here in this Rails guide。

额外提示:当您添加新列时,请更改模型,从而将表名连接到单个名称,例如 PostLocation,这将导致表名 post_locations ... 或者更具描述性的名称。另外,不要在这个字段中使用“order”这个词,因为它是 rails 和 SQL 中的关键字。也许称它为“display_order”?

然后在 PostLocation 模型中,您可能会创建一个范围,甚至是定义正确顺序的默认范围。例如scope :sorted, order("display_order DESC")

我可能会问的另一个问题:帖子的顺序是否真的与任何位置相关联,反之亦然?

【讨论】:

这非常有效。我使用了 default_scope,任何有兴趣的人都可以使用。非常感谢@tharrison 酷!很多人对default_scope 用于过滤时皱眉,就像where(:active => true) 一样,但在我看来,设置默认顺序是一个完美的用途。查看unscoped,以便您知道如果您想更改订单,它就在那里。

以上是关于Rails 3:可以用连接表订购吗?的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Rails 3.2 中使用复合唯一索引将记录添加到连接表

如何在 Rails 3 中订购包含的元素

has_and_belongs_to_many 连接表的 Rails 迁移

Rails 4:如何从数据库中删除或删除(连接)表?

Rails 2.3:Postmarkapp 的 SMTP 设置:连接被拒绝 - 连接(2)

有人可以找到“未知属性”我的语法/逻辑错误是一个多对多的种子创建方法时,在Rails的连接表?