在Rails中按顺序创建嵌套资源?

时间:2014-07-10 18:41:09

标签: ruby-on-rails activerecord

如果我有一个名为Page的模型,其中包含__多行,Page接受Page的嵌套属性,如果我这样做

Page.create({"lines_attributes" : [{"foo1": "bar1"}, {"foo2": "bar2"}]})

有没有办法确保该行

{"foo1": "bar1"}

将在

之前插入
{"foo2": "bar2"}

1 个答案:

答案 0 :(得分:1)

它们已按正确顺序插入,但数据库在您选择时无法保证正确的顺序。您需要在页面模型position中添加另一个属性,以便根据需要对数据进行排序。最简单的方法是使用acts_as_list - gem:

https://github.com/swanandp/acts_as_list

示例:

> rails generate scaffold Page page_number:integer
> rails generate scaffold Line content position:integer page_id:integer

应用/模型/ page.rb

class Page < ActiveRecord::Base
  has_many :lines, -> { order("position ASC") }

  accepts_nested_attributes_for :lines
end

应用/模型/ line.rb

class Line < ActiveRecord::Base
  belongs_to :page
  acts_as_list scope: :page
end

acts_as_list添加到您的Gemfile中。

2.1.0 :001 > Page.create({lines_attributes:[{content: "bar1"}, {content: "bar2"}]})
2.1.0 :002 > puts Page.last.lines.to_yaml
---
- !ruby/object:Line
attributes:
    id: 5
content: bar1
position: 1
page_id: 6
created_at: 2014-07-11 09:38:56.800269000 Z
updated_at: 2014-07-11 09:38:56.800269000 Z
- !ruby/object:Line
attributes:
    id: 6
content: bar2
position: 2
page_id: 6
created_at: 2014-07-11 09:38:56.807034000 Z
updated_at: 2014-07-11 09:38:56.807034000 Z
=> nil