ActiveRecord:Has_many通过(两次)

时间:2011-08-12 11:47:44

标签: ruby activerecord

Thing中有Place个,我正在寻找。一个Thing可以在许多不同的Place中,并且许多Thing可以在一个Place中。

class Thing < ActiveRecord::Base
  has_and_belongs_to_many :places
end

class Place < ActiveRecord::Base
  has_and_belongs_to_many :things
end

我想记录Find的{​​{1}} s,以便我知道他们在哪里找到了什么。

User

这看起来是对的吗?它有效吗?感谢。

1 个答案:

答案 0 :(得分:5)

我认为你走在正确的轨道上,我所做的重大改变是,不应该有一个连接表(places_things),你应该把它变成一个合适的模型。我决定称之为存在。

数据只存在于一个地方,因此它已正确规范化。这些关系很清晰,易于管理。我认为这很有效。

class Place < ActiveRecord::Base
  has_many :existences
  has_many :things, :through => :existences
end

class Thing < ActiveRecord::Base
  has_many :existences
  has_many :places, :through => :existences
end

class Existence < ActiveRecord::Base
  belongs_to :place
  belongs_to :thing
end

class Find < ActiveRecord::Base
  belongs_to :user
  belongs_to :existence
end

class User < ActiveRecord::Base
  has_many :finds
  has_many :existences, :through => :finds
  has_many :things, :through => :existences
end

你需要rails 3.1来做嵌套有很多像我们在用户那样做。

BTW正确的关联声明应该是:belongs_to:places_things