这是独家新闻:
作为一个学习练习,我正在尝试编写一个Rails克隆,其中包含许多基于位置的游戏之一(Foursquare,Gowalla等)我有用户创建和检查进入商店。
在ActiveRecord术语中:
:user has_many :stores
:store belongs_to :user
但是现在我已经创建了第三个模型 - Checkins。模型后面的表包含两个字段,user_id(用于记录哪个用户进行了检查)和store_id(用于记录用户签入的商店)。
再一次,在AR方面:
:checkin belongs_to :user
:checkin belongs_to :store
:user has_many :checkins
:store has_many :checkins
这一切都运行良好 - 在我的用户和商店视图中,我可以分别调用@ user.checkins和@ store.checkins。唯一的事情是,通过这种方式,我只能检索user_id或store_id,我真的想要获取用户名或商店名称。所以我认为中间签入表非常适合使用:through:
:user has_many :stores, :through => :checkins
:store has_many :users, :through => :checkins
这很有意义,但问题是用户已经 has_many商店 - 他创建的商店!在他的用户页面上,我需要列出他创建的商店和他签到的商店。我仍然试图将我的头围绕在has_many_and_belongs_to所以我不确定这是否会让我朝着正确的方向前进。有人想提供线索吗?
答案 0 :(得分:0)
Rails使得处理这种情况变得容易。一种解决方案:您的用户可以为第二组商店使用不同的关系名称。例如:
class Checkin
belongs_to :store
belongs_to :user
end
class Store
belongs_to :user
has_many :checkins
end
class User
has_many :stores
has_many :checkins
has_many :visited_stores, :through => :checkins, :source => :store
end
使用:source
选项告诉ActiveRecord在构建已访问商店列表时查找Checkin
关联:store
。或者,你可以说
has_many :created_stores, :class_name => "Store"
has_many :stores, :through => :checkins
在这种情况下,您将重命名拥有的商店而不是已访问的商店。