1

私はRailsを初めて使用し、保存するformtasticフォームを取得するのに苦労しています.データベースは、明確な説明なしに挿入をロールバックし続けます.

PublishedItem と Citation があります。各 PublishedItem は、Citation を介して他の PublishedItems への多くの参照を持つことができます。

    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

他にも関係がありますが、比較の目的で 1 つだけ含めました: Authorship 関係、別のテーブルへのより典型的な関係、Authors は適切に保存します。私が問題を抱えているのは、自己参照のみです。

引用モデルは次のとおりです。

    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 をciting_published_item として、新しい PublishedItem を citing_published_item として Citations にレコードを挿入することです。しかし、私は困惑しています。選択リストで PublishedItem を選択するたびに、クエリがロールバックします。オーサーシップ (およびその他の M:M) は適切に機能します。

どんな助けでも大歓迎です。

4

1 に答える 1

1

このようなことを試してください -

コントローラー:

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 %>

フォームが次のような構造のパラメーターを渡すようにします。

{published_item : 
  {citations_attributes: 
    [
      {cited_published_item_id: xxx}
    ]
  }
}
于 2012-12-09T11:25:28.450 に答える