如何让foreign_key在这个简单的has_many,belongs_to关系中工作?

时间:2010-03-10 21:48:17

标签: ruby-on-rails activerecord foreign-key-relationship

我从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相匹配来让Projects找到他们的客户端。这是我得到的。

> Project.first.client_id
=> 187259

Project.first.client
=> nil

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

这可能吗?谢谢!

3 个答案:

答案 0 :(得分:0)

由于项目模型中的belongs_to关系位于harvest_id,因此您必须确保在项目对象中设置harvest_id属性。

> Project.first.harvest_id
=> ??

如果未设置harvest_id,则可能会出现问题。

答案 1 :(得分:0)

  

通过将Project。 client_id 与客户匹配来查找客户的项目。 harvest_id

这似乎没有意义,因为客户端和收获应该是不同的对象/记录,你无法匹配它们。

就像“找到有橙子种子的苹果”。

所以我们可能需要更多的背景。


您通过以下方式定义了您的关系:

在项目方面,您说“它通过client_id ”与客户相关,但在客户端上,您说“它与项目通过{{1 }}

你有差异。

所以看起来你只是定义了不正确的映射。

不确定应该如何使用harvest_id,因此假设它只是关联:

harvest_id

答案 2 :(得分:0)

可能看起来不直观,但两种关系的foreign_key必须相同。假设您决定使用harvest_id作为外键。它应该像这样设置:

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

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

由于客户端有很多项目,因此你也只在项目表中有了harvest_id字段。