0

Ich möchte einen benutzerdefinierten Fremdschlüssel in der Join-Tabelle für eine has_many durch Zuordnung in meiner Rails 4 App angeben. Bitte beachten Sie unten, was ich habe, so weit ...Rails 4, benutzerdefinierte Fremdschlüssel in has_many durch Join-Tabelle angeben?

Als ich user.team_memberships.create in der Schienen-Konsole ausführen, erhalte ich diesen Fehler:

ActiveRecord::UnknownAttributeError: unknown attribute 'user_id' for TeamMembership.

users.rb

class User < ActiveRecord::Base 
    has_many :team_memberships 
    has_many :teams, through: :team_memberships 

Teams .rb

class Team < ActiveRecord::Base 
    has_many :team_memberships 
    has_many :members, through: :team_memberships 

team_membership.r

b
class TeamMembership < ActiveRecord::Base 
     belongs_to :member, class_name: 'User', foreign_key: 'member_id' 
     belongs_to :team 

schema.rb

create_table "team_memberships", force: :cascade do |t| 
    t.integer "member_id" 
    t.integer "team_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    add_index "team_memberships", ["member_id"], name: "index_team_memberships_on_member_id", using: :btree 
    add_index "team_memberships", ["team_id"], name: "index_team_memberships_on_team_id", using: :btree 

    create_table "teams", force: :cascade do |t| 
    t.string "name" 
    t.integer "team_snap_id" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

    create_table "users", force: :cascade do |t| 
    t.string "email",     default: "", null: false 
    t.string "encrypted_password",  default: "", null: false 
    t.string "reset_password_token" 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",   default: 0, null: false 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.inet  "current_sign_in_ip" 
    t.inet  "last_sign_in_ip" 
    t.datetime "created_at",       null: false 
    t.datetime "updated_at",       null: false 
    t.string "name" 
    t.integer "teamsnap_uid" 
    t.string "teamsnap_access_token" 
    end 
+0

Was ist passiert, als Sie gerade den Fremdschlüssel in die Beziehung 'has_many: through' für' User' und 'Team' hinzugefügt haben? –

Antwort

1

Sie werden foreign_key: 'member_id' zum has_many Erklärung zu User hinzufügen müssen. Sie können auch die foreign_key Option auf dem belongs_to in TeamMembership entfernen - Rails wird dies automatisch ableiten.

user.rb

class User < ActiveRecord::Base 
    has_many :team_memberships, foreign_key: 'member_id' 
    has_many :teams, through: :team_memberships 

team_membership.rb

class TeamMembership < ActiveRecord::Base 
    belongs_to :member, class_name: 'User' 
    belongs_to :team 
0

Sie müssen in beiden Modellen Fremdschlüssel angeben

class User < ActiveRecord::Base 
    has_many :team_memberships, foreign_key: 'member_id' 
    has_many :teams, through: :team_memberships 
end 

und

class TeamMembership < ActiveRecord::Base 
    belongs_to :member, class_name: 'User', foreign_key: 'member_id' 
    belongs_to :team 
end 

Wenn Sie keinen Fremdschlüssel im Benutzermodell hinzufügen, können Sie keine Teammitgliedschaft für einen Benutzer erstellen, wenn Sie keinen Fremdschlüssel in der Teammitgliedschaft angeben. Dann können Sie keinen Benutzer einer Teammitgliedschaft abrufen.

Verwandte Themen