Rails将多个表连接在一起

时间:2014-10-02 21:16:11

标签: sql ruby-on-rails ruby ruby-on-rails-4

所以我正在尝试创建各种新闻源,但我不确定如何进行查询。

我有一个用户模型,一个跟随位置的模型和一个跟随用户的模型。然后我有一个评论模型。我需要获取用户关注的用户的所有评论以及用户遵循的位置的所有评论,我必须将这些评论放在一起。

我不熟悉如何在sql或rails中执行此操作。任何人都可以将我链接到我可能会发现如何执行此操作的文章或文档吗?

如果您需要更多信息,请评论我应该包含哪些内容,因为我不确定该帖子中包含哪些内容。

评论模型看起来像这样,它是多态的,可以发布到位置和事件

create_table :comments do |t|
  t.text :text
  t.integer :user_id
  t.integer :commentable_id
  t.string :commentable_type

然后有两个单独的表供跟踪用户和以下位置

create_table :followed_locations do |t|
  t.integer :user_id
  t.integer :location_id

create_table :followed_users do |t|
  t.integer :user_id
  t.integer :followed_id

1 个答案:

答案 0 :(得分:1)

以下是模型关联的外观:

class User < ActiveRecord::Base
    has_many :comments, as: :commentable
    has_many :followed_locations
    has_many :followed_users

    def followed_items
        followed_locations.map(&:location).flatten + followed_users.map(&:followed).flatten
    end
end

class Location < ActiveRecord::Base
    has_many :comments, as: :commentable
end

class FollowedUser < ActiveRecord::Base
    belongs_to :user
    belongs_to :followed, class_name: 'User'
end

class FollowedLocation < ActiveRecord::Base
    belongs_to :user
    belongs_to :location
end

class Comment < ActiveRecord::Base
    belongs_to :commentable, polymorphic: true
end

上面的代码定义了所有模型之间的关系,并添加了一个User实例方法来收集给定用户遵循的所有项(位置或用户)。现在,您可以收集单个用户关注的用户/位置的所有注释,如下所示:

user.followed_items.map(&:comments).flatten

这将收集用户(位置和其他用户)的所有后续项目,获取所有注释的列表,然后将它们展平为一个简单的数组。如果你想对它们进行排序,比如我的创作,最后将其添加到最后:

user.followed_items.map(&:comments).flatten.sort_by(&:created_at)

有很多方法可以对此进行优化,但此时您可能只想专注于理解这些概念。

更新:

我创建了一个实现此解决方案的简单Rails 4应用程序,并将其发布在github上:

https://github.com/rubycuts/so26169791