2012-12-08 120 views
1

我是Rails的新手,努力獲得一個formtastic形式來保存 - 數據庫在沒有任何明顯解釋的情況下繼續回滾插入。節省自引用多對多關係

我有一個PublishedItem和一個引文。每個PublishedItem可以通過引用具有其他PublishedItems許多參考 - 這裏是(精簡)PublishedItem型號:

class PublishedItem < ActiveRecord::Base 

     attr_accessible :date_published, 
       :author_ids, 
       :cited_published_item_ids, 
       :citing_published_item_ids 

     has_many :authorships 
     has_many :authors, through: :authorships, order: "last_name, first_name" 

     has_many :citations, 
     foreign_key: "citing_published_item_id", 
     class_name: "Citation", 
     dependent: :destroy 

     has_many :cited_published_items, 
     through: :citations, 
     source: :cited 

     has_many :reverse_citations, 
     foreign_key: "cited_published_item_id", 
     class_name: "Citation", 
     dependent: :destroy 

     has_many :citing_published_items, 
     through: :reverse_citations, 
     source: :citing 

有其他關係,但我只包括一個用於比較的目的:作者身份的關係,更與另一張表的典型關係,作者保存正確。這只是自我參照的問題。

這裏是引文型號:

class Citation < ActiveRecord::Base 

     attr_accessible :citation_type, :cited_id, :citing_id 

     belongs_to :citing, 
     class_name: "PublishedItem", 
     foreign_key: "citing_published_item_id" 

     belongs_to :cited, 
     class_name: "PublishedItem", 
     foreign_key: "cited_published_item_id" 

而且表(PostgreSQL的):

CREATE TABLE citations 
    (
     id serial NOT NULL, 
     citing_published_item_id integer, 
     cited_published_item_id integer, 
     citation_type character varying(255), 
     created_at timestamp without time zone NOT NULL, 
     updated_at timestamp without time zone NOT NULL, 
     CONSTRAINT published_item_citations_pkey PRIMARY KEY (id) 
    ) 
    WITH (
     OIDS=FALSE 
    ); 

的new.html.erb形式(摘錄):

<%= semantic_form_for @published_item do |f| %> 
     <%= f.semantic_errors %> 
     <%= f.inputs do %> 
     <%= f.input :title %> 
     <%= f.input :authors, as: :select, 
      collection: Author.find(:all, order: "last_name ASC, first_name ASC") %> 
     <%= f.input :cited_published_items, as: :select, 
      collection: PublishedItem.find(:all, order: "title ASC") %> 
     <% end %> 
     <%= f.actions do %> 
     <%= f.action :submit, button_html: { class: "btn btn-primary" } %> 
     <%= f.action :cancel, button_html: { class: "btn btn-default" } %> 
     <% end %> 

什麼我想發生,似乎無法實現,是引用傳遞給新的PublishedItem表單的另一個PublishedItem,並將記錄插入到引用中,原始PublishedItem爲referenced_published_item,新的PublishedItem爲citing_published_item。但我很難過。每當我在選擇列表中選擇一個PublishedItem,查詢就會回滾。作者(和其他M:M)正常工作。

任何幫助非常感謝。

+0

看到http://stackoverflow.com/questions/2182428/rails-nested-form-with-has-many-through-how-to-edit-attributes-of-join-model –

+0

謝謝@m_x,但它並沒有真正幫助我 - 當它是同一個對象時,我看不到如何引用關係的另一方。我已經嘗試過所有'@public_item.xxx.build.build_yyy'的組合,並且它們都不起作用。我添加了<%= fields_for:referenced_published_items do | cf | %> ...'並且不能在那裏得到任何喜悅。我幾乎到了將要爲引用和引用出版物分成兩張表格的地步,這將是一個恥辱。 – Alan

回答

0

嘗試這樣的東西 -

控制器:

def new 
    @published_item = PublishedItem.new 
    @published_item.citations.build 
end 

PublishedItem型號:

accepts_nested_attributes_for :citations 
# i noticed your accessible foreign keys were set wrong here 
attr_accessible :citation_type, 
       :cited_published_item_id, 
       :citing_published_item_id 

形式:

<%= semantic_form_for @published_item do |form| %> 
    # published_item fields 
    <%= form.fields_for :citations do |citation_subform| %> 
    <%= citation_subform.select :cited_published_item_id, 
      options_for_select( 
      PublishedItem.order(:title).map{|p|[p.title,p.id]} 
     ) %> 
    <% end %> 
<% end %> 

你希望你的表單傳遞結構類似於PARAMS Ť他:

{published_item : 
    {citations_attributes: 
    [ 
     {cited_published_item_id: xxx} 
    ] 
    } 
} 
+0

謝謝@m_x - 現在我已經解決了,謝謝你。我的代碼中還有其他一些問題,但現在它只是化妝品。非常感謝!!當我有15個聲望點時,我會提高你的答案,因爲我現在沒有許可。再次感謝。我從你的例子中學到了很多東西。 – Alan

+0

以下是後續問題:在驗證citing_published_item_id的存在的情況下,表單報告引用引用不能爲空的錯誤。但沒有驗證,數據正確發佈,包括正確的引用值......可以解釋這個問題嗎? – Alan

+0

mmm ...這很奇怪。我想這是因爲引用是在發佈的項目之後保存的(請參閱關於嵌套屬性的文檔),但驗證過程必須在保存之前保存。你應該在此提出另一個問題,因爲這是關於SO的政策 - 一個問題,一個問題。 –