【问题标题】:Rails one-to-many relationship - keeping orderRails 一对多关系 - 保持秩序
【发布时间】:2012-07-13 19:58:07
【问题描述】:

考虑这段代码:

class Sheet
    has_many :songs
end

class Song
    belongs_to :sheet
end

sheet = Sheet.find(1)
sheet.songs << Song.find(5)
sheet.songs << Song.find(10)
sheet.songs << Song.find(8)

现在的问题是,当我运行下面的代码时,它会返回该表的歌曲列表,但它们的顺序与我在 (5,10,8) 中添加它们的顺序不同。它实际上给了我name订购的歌曲。

songs = Sheet.find(1).songs

如何保持歌曲的初始顺序?

【问题讨论】:

  • 你也可以songs = Sheet.find(1).songs.order("id asc")songs = Sheet.find(1).songs.sort_by(&amp;:id)
  • @house9 我不想通过id 订购。我想保留原来的顺序,就是加入的顺序。
  • 啊,是的,那么您将需要一个额外的模型,正如@CrazyVipa 建议的那样

标签: ruby-on-rails one-to-many


【解决方案1】:

为了有一个默认顺序,你可以做一些事情。

选项 a)

class Sheet
    has_many :songs, :order => 'songs.id DESC'
end

选项 b)

class Song
    belongs_to :sheet
    default_scope :order => 'songs.id DESC'
end

我不建议使用默认范围,因为它往往会导致更多关联出现问题。


对不起,我想我读错了。如果您要保持添加到 Sheet 模型中的顺序,您将需要一个具有某种性质的数据透视表——创建一个 has_many :through

它会变成:

class Sheet
    has_many :songs, :through => :sheet_songs, :order => 'sheet_songs.created_at DESC'
end

【讨论】:

    【解决方案2】:

    也许存储一个时间戳,并根据输入的时间对结果进行排序...我不确定这是最明智的购买方式...

    【讨论】:

      猜你喜欢
      • 2017-06-29
      • 2010-12-20
      • 2011-03-07
      • 2019-09-04
      • 1970-01-01
      • 2017-10-19
      • 2013-07-22
      • 2017-12-23
      相关资源
      最近更新 更多