我正在尝试掌握如何使用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_id
和community_id
)。
我有一个列出所有评论的索引操作,我想按社区过滤。给定一个评论对象,我可以通过comment.user
获取用户对象,但我不能超越它(即comment.user.geography(0).community
之类的东西不起作用。)
看起来这个对象链接是rails的一个关键特性,但它是否与has_many一起使用:通过关联?根据我的例子,是否可以通过使用对象链来从注释对象中获取社区对象,或者在给定注释对象时是否需要编写SQL以获取除用户之外的任何内容?
答案 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.