首页 > 解决方案 > 循环在 Rails 中有很多直通关系

问题描述

我有一个 Post 模型,然后是一个 Reference 模型,用作两个 Post 之间关系的模型。因此,单个帖子(例如,POST A)将有一些它所引用的“推荐”帖子(POST B、POST C 等)......而且它也会有一些“推荐”帖子(POST D、POST E、等)提到它。从 POST A 的“显示”视图来看,我只是试图循环显示所有“推荐”帖子以及它上方和下方的所有“推荐”帖子。我想使用参考关系模型来做到这一点。在创建帖子时成功创建了引用和引用关系/引用关系,但我无法找出正确的代码放置在视图中以在列表中显示这些相关的帖子标题......

参考资料.rb

class Reference < ApplicationRecord 
  belongs_to :referred, class_name: "Post"
  belongs_to :referring, class_name: "Post"
  validates :referred_id, presence: true
  validates :referring_id, presence: true
end

Post.rb

class Post < ApplicationRecord

  has_many :referred_relationships, foreign_key: "referred_id", 
                                  class_name:  "Reference",
                                  dependent:   :destroy
  has_many :referred, through: :referred_relationships, source: :referred

  has_many :referring_relationships, foreign_key: "referring_id", 
                                  class_name:  "Reference",
                                  dependent:   :destroy
  has_many :referring, through: :referring_relationships, source: :referring
end

Posts_Controller.rb

def show
  @title = "Post Profile"
  @post = Post.find(params[:id])
end

def post_params
  params.require(:post).permit(:title, :referred_id)
end

Posts/show.html.erb(帖子个人资料页面)

WHAT CODE WOULD GO HERE TO LOOP THROUGH REFERRING POSTS SHOWING POST TITLES???

<div class="postA">              
     <!-- Title -->
    <h2>
      Post <%= @post.id %>
    </h2>

    !-- Content -->
    <p class="text-muted">
      "<%= @post.title %>"
    </p>
</div>

WHAT CODE WOULD GO HERE TO LOOP THROUGH REFERRED POSTS SHOWING POST TITLES???

更新:

谢谢,我已经尝试了您的建议,如下所示:

 <% if @post.referred.any? %>

            <div class="card">

            <% @referred.each do |referred_post| %>
              <p><%= referred_post.title %></p>
            <% end %>

              <br clear="all">

            </div>

      <% else %>

            <p>no relationships exist</p>

     <% end %>

但不幸的是,它只显示为每个关系循环的原始帖子标题(而不是引用或被引用帖子的标题。

所以它只是遍历原始帖子的标题,如下所示:

更新 2:

架构.rb:

create_table "posts", force: :cascade do |t|
    t.string "title"
    t.bigint "user_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "url"
    t.index ["user_id"], name: "index_posts_on_user_id"
  end

create_table "references", force: :cascade do |t|
    t.integer "referred_id"
    t.integer "referring_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["referred_id", "referring_id"], name: "index_references_on_referred_id_and_referring_id", unique: true
    t.index ["referred_id"], name: "index_references_on_referred_id"
    t.index ["referring_id"], name: "index_references_on_referring_id"
  end

标签: ruby-on-railsrubyfor-loopruby-on-rails-5

解决方案


在控制器中,您可以将相关记录加载到实例变量中,然后从控制器循环它们。

控制器:

def show
  @title = "Post Profile"
  @post = Post.find(params[:id])
  @referring = @post.referring
  @referred = @post.referred
end

看法:

<ul>
<% @referring.each do |referring_post| %>
  <li><%= referring_post.title %></li>
<% end %>
</ul>

你可以用@referred.


推荐阅读