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

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

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

AND Post 2 可能有 Location1、Location4 和 Location5

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

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

【问题讨论】:

    标签: sql ruby-on-rails ruby-on-rails-3 junction-table


    【解决方案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,以便您知道如果您想更改订单,它就在那里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多