2014-07-10 71 views
0

如果我有一個名爲Page模型,該模型的has_many線和Page接受嵌套屬性爲Page,如果我做在Rails中按順序創建嵌套資源?

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

有什麼辦法,以確保線路

{"foo1": "bar1"} 

將是前

{"foo2": "bar2"} 
+0

如果不是,它有關係嗎?看來你應該有一些其他的數據來說明行的順序,而不是依賴於記錄的插入。 – CWitty

回答

1

他們已經插在正確的順序,但數據庫無法插入的Guara當您選擇它時,請選擇正確的順序。您需要在您的Page模型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