2009-08-22 13 views
0

Seufz ... Ich fühle mich wie ein großer Neuling auf diesem, so lässt sagen, dass ich ein paar Modelle haben:Erstellen einer created_by-Spalte und Verknüpfung mit Rails?

class Question < ActiveRecord::Base 
    has_many :answers 
    belongs_to :user 
end 

class Answer < ActiveRecord::Base 
    belongs_to :question 
    has_one :user 
end 

class User < ActiveRecord::Base 
    has_many :questions 
    has_many :answers, :through => :questions 
end 

so ist mein Problem, dass ich nicht weiß, wie der Benutzer zu erhalten, die die erstellt Frage und Antwort, sollte der Benutzer bestimmt werden, wenn die Frage (oder Antwort erstellt wird) erstellt wird, und der Benutzer sollte von den aktuellen Benutzersitzungen (von authlogic Benutzermodell und Controller) sieht hier kommen:

class ApplicationController < ActionController::Base 

    helper_method :current_user_session, :current_user 

    ... 

    private 

    def current_user_session 
    return @current_user_session if defined?(@current_user_session) 
    @current_user_session = UserSession.find 
    end 

    def current_user 
    return @current_user if defined?(@current_user) 
    @current_user = current_user_session && current_user_session.user 
    end 

end 

Jetzt , die current_user Hilfsmethode funktioniert gut, aber wie kann ich festlegen, welcher Benutzer die Frage oder Antwort erstellt hat? wie id einfach sagen @ question.user

BTW, mein Schema für meine Frage hat eine created_by Spalte, aber wenn ich eine neue Frage erstellen bleibt es null.

+0

ich erkannte ich die created_by Spalte verwenden möchten, aber nicht sicher, warum der Verein nicht funktioniert, und die Spalte bleibt null. –

Antwort

2

Der andere Weg, die Ansicht (Rails 4 & 5)

belongs_to :created_by, class_name: "User", foreign_key: "created_by_id" 

wenn zuzuordnen Zwei oder mehr Zuordnungen zu einer Klasse (dh "Benutzer") werden benötigt.

Beispiel: Ich möchte Benutzer (: E-Mail,: Passwort) erstellen und mit Profil (: Name,: Nachname) verknüpfen. Aber ich möchte auch hinzufügen Benutzer eine Fähigkeit, Profil von anderen Benutzern mit ihren: E-Mails zu erstellen (und weiter Einladungen an sie senden).

  1. erstellen Profil (belongs_to Benutzer) und Benutzer (has_one Profil). Diese Zuordnung erstellt Spalte user_id in Profile Tabelle.

  2. In generiert Profile Tabelle Migrationsdatei diese Zeilen hinzufügen:

    t.belongs_to :user, index: true, optional: true 
    

    So ist der Verein wird:

    "Benutzer 1 - 1..0 Profile", Art der Beziehung (so das Profil möglicherweise und möglicherweise nicht user_id)

  3. Fügen Sie die Zuordnung m hinzu an der Spitze zu Profil modelliert.

    belongs_to :created_by, class_name: "User", foreign_key: "created_by_id" 
    
  4. hinzufügen @user.create_by = current_user.id in Profil # erstellen Aktion

3

Anstatt die Spalte created_by aufzurufen, wird die Spalte user_id bevorzugt. Wenn Sie diese Namen für Fremdschlüssel verwenden, können Schienen die Verknüpfungen automatisch "sehen".

Ein einfacher Weg, ein Attribut in der Steuerung festgelegt ist, einen Block als solche zu verwenden:

@question = Question.new(params[:question]) do |q| 
q.user_id = current_user.id 
end 
@question.save 
+0

ahh, super, also ich sehe ... Das setzt die ID des aktuellen Benutzers in dieses Feld. Allerdings habe ich Ihre Empfehlung abgelehnt und eine created_by-Spalte verwendet. –

+0

Das klingt natürlich doof ... aber ich bin mir nicht sicher, wie ich auf den Benutzer zugreifen soll? question.created_by.username funktioniert nicht. aber question.created_by gibt mir die ID des Benutzers. Gedanken? –

+1

Wenn Sie die Spalte created_by aufrufen, müssen Sie stattdessen den Namen der Spalte angeben, da diese standardmäßig user_id (gehört zu: user,: foreign_key => "created_by") annimmt und Sie dann darauf zugreifen können assoziierter Benutzer: (question.user.username) – bdon

Verwandte Themen