Как мне заставить Foreign_key работать в этих простых отношениях has_many, own_to? - PullRequest
1 голос
/ 11 марта 2010

Я получаю данные из Harvest. Вот мои две модели и схема:

# 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'

Я пытаюсь, чтобы Проекты нашли своего клиента, сопоставив Project.client_id с Client.harvest_id. Вот что я получаю вместо этого.

> Project.first.client_id
=> 187259

Project.first.client
=> nil

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

Возможно ли это? Спасибо!

Ответы [ 3 ]

0 голосов
/ 11 марта 2010

Проекты, чтобы найти своего клиента путем сопоставления Project. client_id с клиентом. crop_id

Это, похоже, не имеет смысла, так как клиент и урожай должны быть разными объектами / записями, и вы не можете сопоставить их.

Это как "Найти яблоки там, где есть апельсиноподобные семена".

Так что нам, вероятно, нужно больше контекста.


Вы определили свои отношения следующим образом:

На стороне Проекта вы говорите ", это связано с клиентом через client_id", но на Клиенте вы говорите, что " это связано с проектом через harvest_id «

Там есть расхождение.

Так что, похоже, у вас просто определены неверные отображения.

Не уверен, как предполагается использоватьозаборник_ид, поэтому сделаем предположение, что это просто ассоциация:

# Client.rb
has_many :projects
belongs_to :harvest

# Project.rb
belongs_to :client
belongs_to :harvest

# Harvest
has_one :client
has_one :project
0 голосов
/ 11 марта 2010

Может показаться не интуитивно понятным, но ключ Foreign_key для обоих отношений должен быть одинаковым. Допустим, вы решили использовать в качестве внешнего ключа в качестве внешнего ключа crop_id. Это должно быть настроено так:

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

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

В таблице проектов у вас также будет только поле tail_id, так как у клиента есть проекты has_many.

0 голосов
/ 11 марта 2010

Поскольку отношение belongs_to в модели проекта установлено на harvest_id, необходимо убедиться, что в объекте проекта установлен атрибут harvest_id.

> Project.first.harvest_id
=> ??

Ваша проблема может возникнуть, если harvest_id не установлено.

...