通过关系表在Rails中连接表

时间:2010-11-30 19:06:24

标签: ruby-on-rails join has-many-through

我有三节课;用户,Feed和条目。用户有一个或多个Feed和Feed有一个或多个条目:

class Feed < ActiveRecord::Base
  has_many :entries
  has_many :feeds_users
  has_many :users, :through => :feeds_users, :class_name => "User"
end

Class User < ActiveRecord::Base
  has_many :feeds_users
  has_many :feeds, :through => :feeds_users, :class_name => "Feed"
end

class Entry < ActiveRecord:Base
  belongs_to :feed
end

用户和Feed类通过第三个表格相关:

class FeedsUser < ActiveRecord::Base
  belongs_to :user
  belongs_to :feed
end

现在,我的问题是我需要获取某个用户的供稿和每个供稿的最新n个条目。我正在摆弄这样的事情:

u = User.first
Feed.joins(:entries, :users).where(:entries => { :created_at => (Time.now-2.days)..Time.now }, :users => u)

我的问题是,这会产生一些SQL,试图在“feed”表上查询“用户” - 这是不存在的。

如何创建一个能够为给定用户提供所有Feed及其最新10个条目的正确查询?

1 个答案:

答案 0 :(得分:1)

取出has_many :feeds_users:feeds_users不应该是模特。

你应该保留这张桌子,但是一些Rails魔法会在幕后进行。如果您有一个名为feeds的表和一个名为users的表,Rails将派生查找的表名,除非您以不同方式指定它。

对于你的例子:

Class Feed < ActiveRecord::Base
  has_many :users
end

Class User < ActiveRecord::Base
  has_many :feeds
end

它将在users_feeds表中查找关系。如果它看起来像这样:

Class Feed < ActiveRecord::Base
  belongs_to :user
end

Class User < ActiveRecord::Base
  has_many :feeds
end

它会在user_feeds表中查找关系。

这在语言上是正确的,因为在第一个示例中,许多用户将拥有许多供稿,而在第二个示例中,一个用户将拥有许多供稿。这也是你的关系逻辑是否正确的一个很好的指标。

听起来您还需要has_and_belongs_to_many关系,而不仅仅是has_many

要完全了解所有形式的模型关联,请查看the guide