Rails:在连接表

时间:2018-02-11 07:14:32

标签: mysql ruby-on-rails ruby ruby-on-rails-3

我有两个模型Magazine.rbKeyword.rb,两者都通过一个简单的连接表相关联。一个杂志由许多关键词定义,关键词可以定义许多杂志。

class Keyword < ActiveRecord::Base
  attr_accessible :word
  has_and_belongs_to_many :magazines, :join_table => "magazines_keywords"
end

class Magazine < ActiveRecord::Base
  has_and_belongs_to_many :keywords, :join_table => "magazines_keywords" 
end

现在,我想通过杂志或几本杂志在ingredients/show.html.erb上显示与给定关键字相关的所有关键字,这将是在联接表上共享相同magazine_id的所有其他关键字。我的控制器操作如下:

class IngredientsController < ApplicationController
  def show
    @keyword = Keyword.find(params[:id])
    @keywords = Keyword.find(:all, :order => 'word ASC')
    @k = Keyword.count
  end

我目前在我看来:

Related Keywords
<% i= @k
for keyword in @keywords %>
  <a href="/ingredients/<%= keyword.id %>">
    <div class="keyword">
      <%= keyword.word %>
    </div>
  </a>
<%  i -= 1
end %>

但我会显示所有关键字。如何才能获得相关条目?

更新

在同一视图中,我可以通过以下方式显示与给定关键字相关的所有杂志:

Related Magazines
<% @keyword.magazines.each do |s| %>
  <div>
    <a href='/magazines/<%= s.id %>')>
      <div>Magazin <%= s.number %></div>
    </a>
  </div>
<% end %>

1 个答案:

答案 0 :(得分:0)

如果您只想获得相关的关键字,请尝试使用以下查询:

@keywords = Keyword.joins(magazines: :keywords).where('keywords_magazines_join.keyword_id': @keyword.id).uniq.order(:word)

keywords_magazines_join是Rails为此表的第一个INNER JOIN之后的magazines_keywords表生成的别名。