我有三节课;用户,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个条目的正确查询?
答案 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。