Ruby on rails 通过使用RubyonRails,我很难在has\u many中定义关联

Ruby on rails 通过使用RubyonRails,我很难在has\u many中定义关联,ruby-on-rails,Ruby On Rails,这是一个我已经挣扎了一段时间的问题,我知道如何用find_by_sql解决它,但我觉得很快就能建立这个关联,而不需要执行任何特定的sql,所以我在这里寻求帮助。情况如下: 3种型号:城市、Zipcode、联系人 这个城市有很多Zipcode Zipcode属于城市,有很多联系人 联系人属于Zipcode Zipcode具有包含邮政编码的属性zip。联系人还有一个zip属性。 因此,像亚特兰大这样的城市会有许多邮政编码,每个邮政编码都有许多联系人,他们的地址中都有该邮政编码。目标是我可以这样做:@

这是一个我已经挣扎了一段时间的问题,我知道如何用find_by_sql解决它,但我觉得很快就能建立这个关联,而不需要执行任何特定的sql,所以我在这里寻求帮助。情况如下:

3种型号:城市、Zipcode、联系人 这个城市有很多Zipcode Zipcode属于城市,有很多联系人 联系人属于Zipcode Zipcode具有包含邮政编码的属性zip。联系人还有一个zip属性。 因此,像亚特兰大这样的城市会有许多邮政编码,每个邮政编码都有许多联系人,他们的地址中都有该邮政编码。目标是我可以这样做:@city.contacts并将zipcodes用作联接表

以下是我的模型定义:

class City < ActiveRecord::Base
  has_many :contacts, :through => :zipcodes #this does not work
end

class Contact < ActiveRecord::Base
  belongs_to :zipcode, :foreign_key => :zip, :primary_key => :zip
end

class Zipcode < ActiveRecord::Base
  belongs_to :city
  has_many :contacts, :primary_key => :zip, :foreign_key => :zip
end
下面是控制台用来测试这些关联的内容。除城市外,每个协会都在运作。您可以看到它生成的查询:它是c 正确,除了zipcodes.id应为zipcodes.zip的位置之前。进行更改时,此查询将为关联提取正确的记录。但是h 如何定义关联,以便正确地形成查询?我在这上面花了几个小时

zip=Zipcode.first Zipcode加载0.2ms从Zipcode限制1中选择Zipcode.* => 邮政城市 城市负荷0.5ms选择城市。*从cities.id=7的城市按名称排序限制1 => 邮政信箱 Contact Load 0.3ms选择contacts.*从contacts中,contacts.zip=30084 => [ acity=City.find 7 城市负荷0.3ms选择城市。*从cities.id=7的城市按名称排序限制1 => 密码 Zipcode加载0.2ms从Zipcode中选择Zipcode.*其中Zipcode.city_id=7 => [ 联系人 联系人加载0.3ms选择联系人。*从联系人内部连接contacts.zip=zipcodes.id上的zipcodes,其中zipcodes.city_id=7 =>[]


请注意上面的空结果。KHAAAAAAN!

我认为您让自己的生活变得有点复杂。请尝试删除:foreign\u key、:primary\u key声明,并从rails开始基本操作。如果表设置正确,它应该可以正常工作。让我们知道您的进展情况。祝您一切顺利。

通常情况下,一个has_many:through relationship是一种多对多关系。在这种情况下,每个城市都会有许多联系人为true,而每个联系人都会有许多城市为true?您可能应该重新考虑这种关系定义。因为联系人似乎只属于一个城市,因为它的邮政编码,所以您应该使用cascad一个城市有多个邮政编码,而邮政编码有多个联系人

然而,我确实理解希望以一种简单的方式从所有zipcodes中收集城市所有联系人的愿望。虽然我没有测试过这一点,但在上述模型的设置中存在一些错误

在执行has_many:through关联时,具有多个through的模型也必须具有多个through对象。如city contacts zipcodes示例中所示,您可以尝试以下操作:

class City < ActiveRecord::Base
  has_many :zipcodes
  has_many :contacts, :through => :zipcodes #this does not work
end

让我知道哪一个,如果其中任何一个有效。

谢谢你的回答。在上面,你添加的地方有很多:zipcodes;我实际上已经在模型中有了它,并且愚蠢地没有把它放在我的帖子中。打得好。我有一些类似于你必须构建一个联系人数组的东西。但是因为我想使用rails的“where”“order”“group”a因此,我想找到一个只使用activerecord的解决方案。我最终实现了它,只需将zipcodes表变成一个带有zipcode_id和city_id的联接表。信不信由你,zipcode_id是一个5位数的varchar。不管怎样,它是有效的。按照我最初的设置方式,如上所述,当我尝试执行@city.zipcodes时生成的查询是90%正确的ct;它只是在联接上使用了zipcodes.id主键,而不是zipcodes.zip。因此,通过更改联接表的组成,它起到了作用。它仍然感觉像一个键。
class Zipcode < ActiveRecord::Base
  belongs_to :city
  has_many :contacts
end
class Contact < ActiveRecord::Base
  belongs_to :zipcode

  #not sure about this part
  belongs_to :city, :through => :zipcode
end
def contacts
  contacts = []
  self.zipcodes.each do |z|
    contacts += z.contacts.all
  end
end