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 和许多ReceiverReceiver是任意的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 中缺少&lt;,我为您添加了。 是的,你的结构和代码对我来说很合适。 【参考方案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 通过关联 - 我做对了吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过rails中的关联定义has_many

Rails has_many,如何实现嵌套关联?

Rails 4找不到关联has_many,通过:关系错误

Rails:has_many 通过多态关联——这行得通吗?

Rails ActiveRecord:三个表 has_many 通过:关联

如何区分相似的has_many:通过Rails中的关联?