多对多关系和外键

时间:2014-05-21 00:19:37

标签: ruby-on-rails ruby ruby-on-rails-3 many-to-many relational-database

作为Ruby和关系数据库的相对初学者,我正在研究Rails 3项目中的模型Log的更新。日志表示从一个或多个捐赠者到一个收件人的货物下降。捐赠者和收件人都属于班级。

class Log < ActiveRecord::Base
  ...
  has_many :donors, :class_name => "Location"
  belongs_to :recipient, :class_name => "Location", :foreign_key => "recipient_id"
  ...

在相关的迁移中,我让表格反映了这一点:

class CreateScheduleChains < ActiveRecord::Migration
  def up
    change_table :locations do |l|
      l.references :logs
    end
  ...

目前,这并不像我希望的那样;捐赠者仍然表现得好像与“belongs_to”的日志相关 - 每个捐赠者位置只能与一个日志相关联,其id存储在“log_id”中。如果完全删除迁移引用命令,则只要访问日志的施主阵列就会发生此错误:

PG::UndefinedColumn: ERROR:  column locations.log_id does not exist
LINE 1: SELECT "locations".* FROM "locations"  WHERE "locations"."lo...
                                                     ^
: SELECT "locations".* FROM "locations"  WHERE "locations"."log_id" = 1 ORDER BY locations.name ASC

有什么方法可以给捐赠者一个关键来自我排序,同时仍然允许每个捐赠者/位置与多个日志相关联,同时允许每个日志拥有多个捐赠者?

更新:为了澄清,在当前的上述实现中,locations表有一个log_id列。我想我需要它有一个log_ids列(因为我认为暗示了has_many关系)。

2 个答案:

答案 0 :(得分:0)

在迁移 CreateScheduleChains

中更改此行
l.references :logs to

l.references :log

将在位置

中创建log_id列

答案 1 :(得分:0)

class Log < ActiveRecord::Base
  ...
  has_many :donors, :class_name => "Location"
  belongs_to :recipient, :class_name => "Location", :foreign_key => "recipient_id"
  ...

这意味着您需要在foreign_keys表格中使用以下locations

log_id #-> for donors
recipient_id #-> for recipients

-

我们只是在迁移中引用t.integer时使用foreign_keys

add_column :locations, :log_id, :integer
add_column :locations, :recipient_id, :integer

-

Associations

根据您的意见,您可能最好看这个:

enter image description here enter image description here

这会向您展示如何在应用中设置相关的foreign_keys。阅读有关ActiveRecord关联的信息,您将能够了解如何更好地构建模型