Rails:has_many 通过关联 - 我做对了吗?
Posted
技术标签:
【中文标题】Rails:has_many 通过关联 - 我做对了吗?【英文标题】:Rails: has_many through association - did I get this right? 【发布时间】:2011-09-20 19:58:24 【问题描述】:我使用 Rails 3.1 构建了一个照片共享 Web 应用程序。我只是想验证我的关联是否正确。
一些上下文:一个User
有很多Share
。一个Share
有一个User
(即“sharer”)、一个Photo
和许多Receiver
。 Receiver
是任意的User
。
我使用直通关联的原因仅仅是因为我想为共享照片的每个接收者存储额外的数据。
class Photo < ActiveRecord::Base
has_many :shares
end
class Receiver < ActiveRecord::Base
belongs_to :share
belongs_to :user
end
class Share < ActiveRecord::Base
belongs_to :photo
belongs_to :user
has_many :receivers
has_many :users, :through => :receivers
end
class User < ActiveRecord::Base
has_many :receivers
has_many :shares, :through => :receivers
end
然后可以使用shares
类方法检索User
共享照片吗?
User.first.shares
# => [<#Share:0x000>, ...]
然后可以使用receivers
类方法来检索User
收到的共享吗?
User.first.receivers
# => [<#Receiver:0x000>, ...]
我做对了吗?
【问题讨论】:
您在class Photo ActiveRecord::Base
中缺少<
,我为您添加了。
是的,你的结构和代码对我来说很合适。
【参考方案1】:
前段时间我做了类似的事情,我没有测试这段代码,所以请尝试一下,看看它是否真的是您需要的,但它可能会为您指明正确的方向。
如果你的工作我看不出改变它的意义,这段代码有点复杂,但你没有接收器模型,一切都通过共享模型。
class User < ActiveRecord::Base
has_many :shares_links, :class_name => "Share", :foreign_key => :sharing_id, :dependent => :destroy
has_many :receiver_links, :class_name => "Share", :foreign_key => :shared_to_id, :dependent => :destroy
has_many :shares, :through => :shares_links
has_many :receivers, :through => :receiver_links
end
class Share < ActiveRecord::Base
belongs_to :sharing, :validate => true, :class_name => "User", :foreign_key => :sharing_id
belongs_to :shared_to, :validate => true, :class_name => "User", :foreign_key => :shared_to_id
has_one :photo
end
class Photo < ActiveRecord::Base
belongs_to :photo
end
User.first.shares
User.first.receivers
User.first.receivers.first.photo
【讨论】:
我可能对问题的理解有误 :) 如果是这样,请告诉我删除答案:P 一点也不。我试图完成类似的事情,直到我意识到我想存储关于每个共享的额外数据。以上是关于Rails:has_many 通过关联 - 我做对了吗?的主要内容,如果未能解决你的问题,请参考以下文章