3 Stimmen

Konnte die Quellenverknüpfung(en) :character im Modell Beziehung nicht finden.

Ich habe zwei Modelle namens Benutzer und Beziehungen. Relation speichert die Beziehungen zwischen Benutzern, und es gibt verschiedene Arten von Beziehungen. Im Moment versuche ich, zwei Arten zu implementieren: Freunde und Freundesanfragen.

Hier sind meine Klassenverknüpfungen:

class Relation < ActiveRecord::Base
  belongs_to :owner, class_name: "User"
  validates :owner, presence: true
  validates :character, presence: true
end

class User < ActiveRecord::Base

  has_many :characters, dependent: :destroy
  has_many :relations, foreign_key: "owner", dependent: :destroy
  has_many :friends, -> { where reltype: "friend" }, through: :relations, source: "character"

  has_many :reverse_relations, foreign_key: "character", class_name: "Relation", dependent: :destroy
  has_many :friend_requests, -> { where reltype: "freq" }, through: :reverse_relations, source: :owner

  .
  .
  .
end

Im IRB versuche ich, das durch User.friends generierte Array zu verwenden, und dieser Fehler wird ausgelöst:

Lade Entwicklungsumgebung (Rails 4.0.0)
irb(main):001:0> user = User.find(1)
  User Load (12.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
=> #
irb(main):002:0> user.friends
ActiveRecord::HasManyThroughSourceAssociationNotFoundError: Could not find the source association(s) :character in model
 Relation. Try 'has_many :friends, :through => :relations, :source => '. Is it one of :owner?
        <...stack trace...>
irb(main):003:0>

Mache ich etwas falsch?


Mein Schema, wie angefordert:

ActiveRecord::Schema.define(version: 20131102102750) do

  # Diese Erweiterungen müssen aktiviert sein, um diese Datenbank zu unterstützen
  enable_extension "plpgsql"

  create_table "characters", force: true do |t|
    t.integer  "accountid"
    t.string   "username"
    t.integer  "roundles"
    t.integer  "gems"
    t.integer  "rank"
    t.integer  "tier"
    t.datetime "tiertime"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "permission_ranks", force: true do |t|
    t.string   "label"
    t.integer  "badge"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "relations", force: true do |t|
    t.integer  "owner"
    t.integer  "character"
    t.string   "reltype"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  add_index "relations", ["character"], name: "index_relations_on_character", using: :btree
  add_index "relations", ["owner", "character"], name: "index_relations_on_owner_and_character", unique: true, using: :btree
  add_index "relations", ["owner"], name: "index_relations_on_owner", using: :btree

  create_table "tickets", force: true do |t|
    t.string   "title"
    t.text     "desc"
    t.integer  "sender"
    t.integer  "assigned"
    t.text     "addinfo"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "users", force: true do |t|
    t.string   "name"
    t.string   "email"
    t.string   "password_digest"
    t.boolean  "verified"
    t.string   "reg_ip"
    t.string   "last_ip"
    t.integer  "character_limit"
    t.integer  "characters"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "remember_token"
    t.integer  "playchar"
  end

  add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree
  add_index "users", ["name"], name: "index_users_on_name", unique: true, using: :btree
  add_index "users", ["remember_token"], name: "index_users_on_remember_token", using: :btree

end

4voto

Edgars Jekabsons Punkte 2783

OK, ich denke, das Problem liegt beim Benennen. Es ist keine gute Idee, Verknüpfung und Spalte mit demselben Namen zu benennen. Wenn möglich, beginnen Sie mit der Umbenennung von Spalten in Beziehung:

owner     => owner_id
character => character_id

Alternativ können Sie die Verknüpfungen umbenennen:

owner     => user_owner
character => user_character

Ein weiteres, was ich sehe, ist Ihre separate characters Tabelle. Sie möchten anscheinend die characters Tabelle von Ihrem Relation-Modell aus verweisen (korrigieren Sie mich, wenn ich falsch liege), tun es aber nie.

belongs_to :user_character, foreign_key: "character"

Nun zu Ihrer Hauptfrage. Wenn ich Sie richtig verstanden habe, möchten Sie eine Liste von Charakteren erhalten, die die Freunde-Verknüpfung verwenden, die in User definiert ist. In diesem Fall sollte die Zeile so aussehen:

has_many :friends, -> { where reltype: "friend" }, through: :relations, source: "user_character", class_name: "Character"

AKTUALISIERT

Der Autor hat erklärt, dass er wirklich auf das User-Modell über die friends Verknüpfung verweisen möchte.

# relation.rb
belongs_to :user_character, foreign_key: "character", class_name: "User"

# user.rb
has_many :friends, -> { where reltype: "friend" }, through: :relations, source: "user_character"

UPDATE2

Es gab ein Problem mit der Verknüpfungsbedingung, in diesem speziellen Fall müssen Sie die Tabelle explizit angeben:

has_many :friends, -> { where("relations.reltype" => "friend") }, through: :relations, source: "user_character"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X