Ich spiele mit dem Erstellen eines Blogs. Ich hätte gerne mehrere Arten von Einträgen (einen Link zu einer interessanten Seite + einen kurzen Kommentar, einen traditionellen Blogbeitrag mit Titel und Text, ein Bild ... Sie haben die Idee).Foreign Keys und Multi Model-Formulare in Rails 2.3 - Bug oder Feature?
Die Idee schien geradlinig. Eine Eintragstabelle/ein Modell mit den wenigen Details, die allen diesen Typen gemeinsam sind (Erstellungszeit und ein kleiner Teaser/Vorschautext oder etwas Ähnliches) und dann eine Tabelle/Modell für jede Art von Eintrag, die ich möchte, wird auf die Eintragstabelle verweisen/Modell.
Ich habe meine App nach this great tutorial für das neue Multi-Formular-Zeug in 2.3 eingerichtet.
class Link < ActiveRecord::Base
has_one :entry
accepts_nested_attributes_for :entry
attr_accessible :url, :description, :title, :entry_attributes
end
class Entry < ActiveRecord::Base
belongs_to :link, :dependent => :destroy #adding more types later
end
Von Links_Controller. Erstellen einen neuen Verbindungstyp Eintrag:
def new
@link = Link.new()
@link.build_entry
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @link }
end
end
und die Aussicht Form:
<% form_for(@link) do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :title %><br />
<%= f.text_field :title %>
</p>
<p>
<%= f.label :url %><br />
<%= f.text_field :url %>
</p>
<p>
<%= f.label :description %><br />
<%= f.text_field :description %>
</p>
<% f.fields_for :entry do |e| %>
<%= e.label :teaser %><br />
<%= e.text_field :teaser %>
<%= e.text_field(:controller_name, :value => params[:controller].to_s) %>
<% end %>
<p>
<%= f.submit 'Create' %>
ich den Namen des Controllers bin Speicherung nur so kann ich Einträge aufzulisten, sondern auf die richtigen Controller beziehen anzuzeigen. Obwohl es scheint zu funktionieren (das Multi-Model-Formular wird übermittelt und eine Zeile erscheint in der Tabelle für jedes der beteiligten Modelle), ist das Fremdschlüsselfeld für alle Einträge null. Ich In der Datenbank erhalten:
mysql> select * from links;
+----+------------+------------------+---------------------+-------------+
| id | entries_id | title | url | description |
+----+------------+------------------+---------------------+-------------+
| 10 | NULL | Snazzy website | www.somewebsite.com | Cool site |
| 11 | NULL | Snazzy website | www.somewebsite.com | Cool site |
| 12 | NULL | Snazzy website | www.somewebsite.com | Cool site |
| 13 | NULL | Snazzy website 2 | www.ab21e312e3c.com | Description |
| 14 | NULL | fk_test | fk_test | fk_test |
mysql> select * from entries;
+----+-----------------+------------------------+---------------------+---------
------------+
| id | controller_name | teaser | created_at | updated_
at |
+----+-----------------+------------------------+---------------------+---------
------------+
| 10 | links | Check it out | 2009-08-11 09:06:47 | 2009-08-
11 09:06:47 |
| 11 | links | Check it out | 2009-08-11 09:08:49 | 2009-08-
11 09:08:49 |
| 12 | links | Check it out | 2009-08-11 09:09:04 | 2009-08-
11 09:09:04 |
| 13 | links | This is interesting... | 2009-08-11 09:27:29 | 2009-08-
11 09:27:29 |
| 14 | links | fk_test | 2009-08-11 20:42:26 | 2009-08-
11 20:42:26 |
+----+-----------------+------------------------+---------------------+---------
------------+
Dieser Mangel an Fremdschlüssel ist Retrieval schwierig macht, da es sich in der Regel auf die FK-Werte beruht. Ein paar Fragen kommen aus diesem:
Ich weiß DHH off DB Einschränkungen als Business-Logik schreibt die konzeptionell in dem Modell gehört, so ist dies, wie seine Arbeit soll oder habe ich etwas falsch gemacht?
Sollte ich einen Weg finden, um Daten zu greifen, basierend auf der Tatsache, dass die ID die gleiche in der Tabelle Einträge und der Tabelle Links ist?
Gibt es einen besseren Weg zu tun, was ich versuche?
Danke Ryan! Du hattest recht mit dem FK. Ich hatte die Beziehung umgekehrt. Sobald ich festgestellt habe, dass die Abfragen mehr Sinn ergeben und die wahre Ursache des Problems aufgedeckt haben, Meine Tabellen wurden mit Referenzen definiert: Einträge statt Referenzen: Eintrag. Jetzt funktioniert alles! Vielen Dank, dass Sie sich die Zeit genommen haben, zu antworten. Ich bin ein großer Fan von Ihren Railscasts BTW. Mach weiter so! – mikewilliamson