Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 如何使用活动记录方法获取关联的直通集合(代理集合)_Ruby On Rails 4_Rails Activerecord - Fatal编程技术网

Ruby on rails 4 如何使用活动记录方法获取关联的直通集合(代理集合)

Ruby on rails 4 如何使用活动记录方法获取关联的直通集合(代理集合),ruby-on-rails-4,rails-activerecord,Ruby On Rails 4,Rails Activerecord,我有一个在订阅和文章之间有很多关系,一篇文章有一个产品 class Subscription < ActiveRecord::Base has_many :articles end class Article < ActiveRecord::Base belongs_to :subscription belongs_to :product end class Product < ActiveRecord::Base has_many :subscriptio

我有一个
订阅
文章
之间有很多关系,一篇文章有一个
产品

class Subscription < ActiveRecord::Base
  has_many :articles
end

class Article < ActiveRecord::Base
  belongs_to :subscription
  belongs_to :product
end

class Product < ActiveRecord::Base
  has_many :subscriptions
end
解决方案
有许多:通过

class Subscription < ActiveRecord::Base
  has_many :articles
  has_many :products, through: articles
end
类订阅
第一种方法的缺点是它不返回可以链接的集合(例如,
subscription.products.pulk(:id)
),而是返回一个简单的数组

第二个在“语义”上并不完全正确:我不希望它成为一个完整的关联,而只是一个获取列表的助手


我是否只是忽略了一些允许我获取相关直通项的activerecord方法?

我通常会将其写为“has\u many through”,因此返回的
产品将表现为一种关系。要在
订阅
方法中实现类似的功能,您可以将缺少的
has\u many
关联添加到
产品
,并合并
产品
加入上的订阅文章:

class Product < ActiveRecord::Base
  has_many :articles
end

class Subscription < ActiveRecord::Base
  has_many :articles

  def products
    Product.joins(:articles).merge(articles)
  end
end
类产品

在这种情况下,
Subscription#products
将返回一个
ActiveRecord
集合。

您能否澄清一下为什么不希望此集合成为“has#u many through”?从外面看,这似乎是一个理想的解决方案。
bar有很多:foo,通过::baz
做了很多事情,而不仅仅是允许我获取
self.baz.foo
:它为我的公共界面添加了很多方法和内容。此外,它向外界传达了自我、foo和bar之间的耦合。更糟糕的是,这是一个漏洞百出的抽象:突然间,我的
bar
知道
baz
foo
是如何耦合的。而在clean OOP中,我对它一点也不感兴趣:只是因为我将
foo
发送给我的
baz
;没别的了。啊,是的,这都是真的。引用Joel的话,“所有非琐碎的抽象在某种程度上都是漏洞百出的”。ActiveRecord既是一种方便,也是一种折衷。一般来说,使用Rails,我们可以花时间与框架的约定作斗争,并在所提供的基础上更加努力地执行其他约定,或者我们可以做简单的事情。在某些情况下,我发现这些担忧中的许多其实并不重要,但这只是观点。你完全正确,@rossta,但上面的代码已经是一个非常简化的现实版本。我试图解决的是,几乎每个模型中都出现了一个spagetti的
has_many:foo,through:bar
,它与当前应用程序中的几乎所有其他模型相关联。换句话说:目前我们的大部分模型都与应用程序中的所有其他模型相连接。我想,这是这里的关键:“添加缺少的与
产品
”我不完全确定
产品
中有许多文章
的真正含义。它听起来像是一个私人助手,允许创建更好的连接;但实际上,我正在向产品的公共API添加内容。还是我遗漏了一个关键点?如果没有上下文,我不知道
中有多少:关于
产品
的文章对您的领域真正意味着什么。在最基本的层面上,它只是反映了文章所属的产品的反面。您是对的,它确实添加到了产品的公共api中,其中包括执行连接的能力,如我所示。否则,您需要在products方法中使用SQL,或者使用您自己的保持这些关系私有的概念。要通过Rails获得便利,产品确实需要“了解”文章。
class Product < ActiveRecord::Base
  has_many :articles
end

class Subscription < ActiveRecord::Base
  has_many :articles

  def products
    Product.joins(:articles).merge(articles)
  end
end