作为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关系)。
答案 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
-
根据您的意见,您可能最好看这个:
这会向您展示如何在应用中设置相关的foreign_keys
。阅读有关ActiveRecord关联的信息,您将能够了解如何更好地构建模型