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 中使用复合唯一索引将记录添加到连接表
has_and_belongs_to_many 连接表的 Rails 迁移