如何正确关联这两个对象?

时间:2014-05-04 02:55:12

标签: ruby-on-rails activerecord associations

我有什么:

class Map < ActiveRecord::Base
    has_many :connections
end

这很好用。我还有其他两个模型,ConnectionSystem。每个Connection都有一个from属性和一个to属性,我希望这两个属性都是System个对象。

class Connection < ActiveRecord::Base
    belongs_to :map

    belongs_to :system, :class_name => "System", :foreign_key => "from"
    belongs_to :system, :class_name => "System", :foreign_key => "to"
end

class System < ActiveRecord::Base
    has_many :connections, foreign_key: "from"
    has_many :connections, foreign_key: "to"
end

这就是我现在所处的位置。我之前认为Connectionhas_one :from, :class_name "System",但导致rails在System表中查找connection_id列。

但这不起作用。

@map.connections.each do |con|
    con.from.name #nomethod 'name' for FixNum error here
    con.to.name   #nomethod 'name' for FixNum error here
end

然而,这确实有效。

@map.connections.each do |con|
    System.find(con.from).name
    System.find(con.to).name
end

到目前为止,我只是在努力解决这个问题,但是在事情变得复杂之前,我希望这些东西能正常关联。

2 个答案:

答案 0 :(得分:1)

赞美太阳!!!

class Connection < ActiveRecord::Base
    belongs_to :map

    belongs_to :from, :class_name => "System", :foreign_key => "from"
    belongs_to :to, :class_name => "System", :foreign_key => "to"
end

答案 1 :(得分:1)

为任何观察者提供此工作的原因 - 当您设置ActiveRecord associations in Rails时,您实际上正在为您的模型创建另一个方法/属性

例如,当您将关联定义为:system时,您将能够在视图/控制器/模型中调用@object.system。但是,这也意味着此方法被占用 - 阻止您再次使用它(否则会被覆盖)

您发现的是,调用systemfrom,而不是调用您的关联to,您的关联将被正确处理,让您能够调用{{1 }和@object.from