2009-08-11 8 views
1

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:

  1. 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?

  2. 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?

  3. Gibt es einen besseren Weg zu tun, was ich versuche?

Antwort

2

Ihr Fremdschlüssel scheint in der falschen Tabelle zu sein. Das Modell mit der belongs_to Zuordnung sollte den Fremdschlüssel haben, so dass die entries Tabelle eine link_id Spalte haben sollte.

1) Ich weiß, DHH off DB Einschränkungen als Business-Logik schreibt, dass konzeptionell in dem Modell gehört, so dies ist, wie sein angeblich arbeiten oder habe ich etwas falsch gemacht?

Der Fremdschlüssel sollte gesetzt sein, damit es nicht richtig funktioniert. Ob die Beschränkungen in das Modell oder die Datenbank gehören, habe ich auf beiden Seiten gute Argumente gehört.

2) Soll ich einen Weg finden, um Daten basierend auf der Tatsache zu greifen, dass die ID beide dasselbe in den Einträgen Tabelle ist und die Verknüpfungen Tabelle?

Definitiv nicht, das ist nicht garantiert, um gleich zu bleiben. Alles, was es braucht, ist eine weitere Reihe auf beiden Seiten, um alles auszugleichen, was zu einem großen Durcheinander führt.

3) Gibt es einen besseren Weg zu tun, was ich versuche?

Versuchen Hinzufügen der link_id Spalte entries und sehen, ob das für Sie arbeitet.

+0

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

Verwandte Themen