Rails 3:使用has_many进行对象链接:通过关联

时间:2012-06-30 23:58:25

标签: ruby-on-rails-3 associations

我正在尝试掌握如何使用Rails中的关联,特别是何时以及何时不编写显式SQL代码。

在我的应用程序中,我有四个模型,定义如下:

class User < ActiveRecord::Base
    has_many :comments
    has_many :geographies
    has_many :communities, through: :geographies

class Comment < ActiveRecord::Base
    belongs_to :user

class Community < ActiveRecord::Base
    has_many :geographies
    has_many :users

class Geography < ActiveRecord::Base
    belongs_to :user
    belongs_to :community

用户可以发布评论,并通过地理位置表与一个或多个社区相关联(地理位置表存储user_idcommunity_id)。

我有一个列出所有评论的索引操作,我想按社区过滤。给定一个评论对象,我可以通过comment.user获取用户对象,但我不能超越它(即comment.user.geography(0).community之类的东西不起作用。)

看起来这个对象链接是rails的一个关键特性,但它是否与has_many一起使用:通过关联?根据我的例子,是否可以通过使用对象链来从注释对象中获取社区对象,或者在给定注释对象时是否需要编写SQL以获取除用户之外的任何内容?

2 个答案:

答案 0 :(得分:0)

我认为你不需要地理位置表。

尝试

class Community < ActiveRecord::Base
    has_many :users
end

class User < ActiveRecord::Base
    belongs_to :community
    has_many :comments
end

class Comment < ActiveRecord::Base
    belongs_to :user
end

然后您就可以访问评论的用户社区了 @comment.user.community

答案 1 :(得分:0)

由于User与多个社区相关联,您需要告诉ActiveRecord(或原始SQL)您想要哪个社区:

comment.user.communities #=> should give you all the communities

如果您不特别关心所有社区,只想获得任何社区

comment.user.communities.first #=> should give you the first community

但是,一般情况下,您会根据条件对某个特定社区感兴趣。

comment.user.communities.where(name: 'Europe') #=> should give you the European community.