【问题标题】:Joining tables in Rails through relation table通过关系表连接 Rails 中的表
【发布时间】:2011-05-18 01:51:04
【问题描述】:

我有三门课;用户、提要和条目。用户有一个或多个 Fe​​ed,而 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

User 和 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 来尝试查询表“feeds”上的“users”——它不存在。

如何创建一个正确的查询,以便为我提供给定用户的所有提要及其最新的 10 个条目?

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • 您是否建议我也只删除数据库中的模型或表?那么如何保持多对多关系呢?
    • 谢谢,has_and_belongs_to_many 工作正常(意味着我可以分别调用feeds´ and users´)但我的 joins/where 命令仍然引发相同的错误:它尝试查询“提要”上的“用户”字段" 表。
    • 每次使用 HABTM 时,我总是后悔并返回,不得不改造关联模型并使用 has_many :through
    • 是的,我也做过几次。辅助方法非常好,但除非你理解“魔法”,否则它很快就会变得相当复杂。
    • 好了,现在可以了。注意:u.feeds 是一个数组,并且“条目”是数组上的一个方法,因此它不会返回预期的条目列表。就我而言,我放弃了使用一条神奇的线来满足我的需求,并在 User 类上创建了一个小方法,该方法从所有用户的提要中收集所有相关条目并将它们作为列表返回。足够好(TM)。
    猜你喜欢
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 2015-07-19
    相关资源
    最近更新 更多