Wie kann ich Foreign_key dazu bringen, in dieser einfachen Beziehung zu arbeiten, die die Beziehung hat?

StackOverflow https://stackoverflow.com/questions/2420881

Frage

Ich ziehe Daten aus der Ernte. Hier sind meine zwei Modelle und mein Schema:

# schema
create_table "clients", :force => true do |t|
  t.string   "name"
  t.integer  "harvest_id"      
end

create_table "projects", :force => true do |t|
  t.string   "name"
  t.integer  "client_id"
  t.integer  "harvest_id"
end

# Client.rb
has_many :projects, :foreign_key => 'client_id' # not needed, I know

# Project.rb
belongs_to :client, :foreign_key => 'harvest_id'

Ich versuche, die Projekte dazu zu bringen, ihren Kunden zu finden, indem ich Project.client_id an einen Client.Harvest_id übereinstimme. Hier ist, was ich stattdessen bekomme.

> Project.first.client_id
=> 187259

Project.first.client
=> nil

Client.find(187259).projects
=> []

Ist das möglich? Vielen Dank!

War es hilfreich?

Lösung

Vielleicht nicht intuitiv erscheinen, aber der Fremd_key für beide Beziehungen muss gleich sein. Nehmen wir an, Sie beschließen, Harvest_ID als Fremdschlüssel zu verwenden. Es sollte so eingerichtet werden:

# Client.rb
has_many :projects, :foreign_key => 'harvest_id'

# Project.rb
belongs_to :client, :foreign_key => 'harvest_id'

Sie hätten auch nur das Feld rarvest_id in der Projekttabelle, da der Kunde Projekte hat.

Andere Tipps

Da dein belongs_to Die Beziehung im Projektmodell ist auf harvest_id, Sie müssen das sicherstellen harvest_id Das Attribut wird im Projektobjekt festgelegt.

> Project.first.harvest_id
=> ??

Ihr Problem kann auftreten, wenn die harvest_id ist nicht eingestellt.

Projekte, um ihren Kunden durch das Projekt zu finden.Kunden ID zu einem Kunden.Harvest_id

Dies scheint nicht sinnvoll zu sein, da Client und Ernte unterschiedliche Objekte/Datensätze sein sollen und Sie nicht mit ihnen übereinstimmen können.

Es ist wie "finden Sie Äpfel, wo es orangeähnliche Samen gibt".

Wir brauchen also wahrscheinlich mehr Kontext.


Sie haben Ihre Beziehungen auf folgende Weise definiert:

Auf der Projektseite sagen Sie "Es bezieht sich auf den Kunden über client_id", aber auf dem Kunden sagen Sie das"Es bezieht sich auf das Projekt über harvest_id"

Dort haben Sie Diskrepanz.

Es scheint also, dass Sie nur falsche Zuordnungen definiert haben.

Ich bin mir nicht sicher, wie Harvest_id verwendet werden soll.

# Client.rb
has_many :projects
belongs_to :harvest

# Project.rb
belongs_to :client
belongs_to :harvest

# Harvest
has_one :client
has_one :project
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top