2016-03-27 6 views
1

Meine Join-Tabelle wird nicht automatisch aus den beiden Tabellen, aus denen sie stammt, übernommen. Ich habe ungefähr 5 Stunden damit verbracht, es auf verschiedene Arten zu verbinden, ohne Erfolg. Jede Anleitung zu meinem Code würde sehr geschätzt werden.Rails - Join Table wird nicht automatisch geuploadet

Hier ist mein Code.

Erster Artikel:

`class Order < ActiveRecord::Base 

    belongs_to :orders_users 
    has_many :users, :through => :orders_users 

    validates :item, presence: true 

end 

def add_order(order) 
end 

def remove_order(order) 
end 

` 

Zweiter Artikel:

class User < ActiveRecord::Base 
    belongs_to :orders_users 
    has_many :orders, :through => :orders_users 

    validates :username, presence: true, uniqueness: true 
    has_secure_password 
end 

Die Migration:

class CreateJoinTable < ActiveRecord::Migration 
    def change 
    create_join_table :users, :orders do |t| 
     t.index [:user_id, :order_id] 
     t.index [:order_id, :user_id] 
    end 
    end 
end 

Orders Controller:

class OrdersController < ApplicationController 


    def new 
    binding.pry 
    @order = Order.new 
    end 

    def create 
    @order = Order.new(order_params) 
    if @order.save 
     redirect_to request.referer 
    else 
     redirect_to root_path 
    end 
    end 

    def show 
    @order 
    end 

    private 

    def order_params 
    params.require(:order).permit(:item) 
    end 



end 
-Controller

Benutzer:

class UsersController < ApplicationController 
    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(user_params) 

    if @user.save 
     session[:current_user_id] = @user.id 
     redirect_to user_path(@user) 
    else 
     redirect_to new_user_path(@user) 
    end 
    end 

    def show 
    @user = User.find(params[:id]) 
    end 

    def destroy 
    @user = User.find(params[:id]) 
    session[:current_user_id] = nil 
    @user.destroy 
    redirect_to root_path 
    end 


    def index 
    @user 
    end 

    private 

    def user_params 
    params.require(:user).permit(:username, :password,:password_confirmation) 
    end 


end 
+1

Es ist ein wenig unklar. Kannst du erklären, was du damit erreichen willst? –

+0

Danke für Ihre Antwort. Hier ist, was ich versuche zu tun: Wenn ein Benutzer ein Element in die Datenbank einfügt, möchte ich eine Join-Tabelle, um aufzuzeichnen, welcher Benutzer welche Elemente in die Datenbank eingegeben hat. Klärt das meine Frage? – CodeYogi

+0

Ich denke, After_Save-Filter im Auftrag Modell wird tun, was Sie verlangten. Hast du es versucht ? –

Antwort

1

Sie die Verbände gemischt wurden auf der Order und die User Modelle.

Sie haben 2 Möglichkeiten.

  1. Entfernen der "hat viele durch" und verwenden HABTM (hat und gehört zu viele)
  2. Entfernen Sie Ihre jointable und erstellen Sie eine neue "echte" OrderUser Modell

Option 1 ändern Sie Ihre User und Order Modelle dazu:

class Order < ActiveRecord::Base 
    has_and_belongs_to_many :users 

    validates :item, presence: true 

    def add_order(order) 
    end 

    def remove_order(order) 
    end 

end 

class User < ActiveRecord::Base 
    has_and_belongs_to_many :orders 

    validates :username, presence: true, uniqueness: true 
    has_secure_password 
end 

Option 2 has_many durch

Es has_many statt belongs_to sein sollte.

class Order < ActiveRecord::Base 
    has_many :order_users 
    has_many :users, :through => :order_users 

    validates :item, presence: true 

    def add_order(order) 
    end 

    def remove_order(order) 
    end 

end 

class User < ActiveRecord::Base 
    has_many :order_users 
    has_many :orders, :through => :order_users 

    validates :username, presence: true, uniqueness: true 
    has_secure_password 
end 

Transfer abbrechen Sie db die jointable

rake db:rollback 

Entfernen Sie die alte Migrationsdatei mit der JoinTable Migration zu entfernen.

erstellen „echten“ Modell für die Verwendung von „has_many durch“

rails g model OrderUser order:references user:references 
rake db:migrate 

Tipp, wie Sie die Active Beziehungen überprüfen

Über die Schienen Konsole, auf diese Weise Sie nicht haben sich darum kümmern, dass die Controller korrekt arbeiten.Ein kleines Beispiel:

rails c 
> u = User.create username: "test" 
> o = u.orders.new item: "test-item" 
> o.save 

Bearbeiten Sie Ihre Bestellung Controller

Wenn die Reihenfolge Erstellen Sie die current_user auf dem auftrags Objekt angeben müssen. In dem Beispiel verwende ich current_user, um den signierten Benutzer zu erhalten, abhängig von Ihrer App müssen Sie dies möglicherweise ändern.

class OrdersController < ApplicationController 


    def new 
    @order = Order.new 
    end 

    def create 
    @order = Order.new(order_params) 
    @order.users.build(current_user) #current_user is a function returning the signed in user 
    if @order.save 
     redirect_to request.referer 
    else 
     redirect_to root_path 
    end 
    end 

    def show 
    @order 
    end 

    private 

    def order_params 
    params.require(:order).permit(:item) 
    end 



end 

Einige Informationen aus den Schienen führen über has_many through

+0

Ich tat, wie Sie ohne Erfolg vorgeschlagen. Alle anderen Vorschläge würden sehr geschätzt werden. Vielleicht habe ich wegen der Abkürzungen nichts in Ihrem Code gefunden. Vielen Dank. – CodeYogi

+0

Ich habe die Antwort und das Beispiel ein wenig geklärt. Die Hauptsache ist, dass Sie bei Verwendung von JoinTable-Migrationen nicht "has_many through" verwenden sollten. –

+0

Danke, Jacob. Hier ist, was ich versuche zu tun: Wenn ein Benutzer ein Element in die Datenbank einfügt, möchte ich eine Join-Tabelle, um aufzuzeichnen, welcher Benutzer welche Elemente in die Datenbank eingegeben hat. Klärt das meine Frage? – CodeYogi

Verwandte Themen