使用一对多关联获取数据

时间:2011-12-12 06:27:20

标签: ruby-on-rails activerecord associations models one-to-many

我是ror的新手。我有2个表用于组(称为'ab')和子组(称为'cd')。每个组有几个子组。我已经定义了belongs_to和has_many关系。

模型ab.rb

class Ab < ActiveRecord::Base
has_many:cds
end

模型cd.rb

class Cd < ActiveRecord::Base
belongs_to :ab
end

ab和cd有2列,每列名为title和Dscr。我必须创建一个连接表(ab_cd_join_table)

我想在视图中显示特定组及其子组。

视图的控制器

class DisplayController < ApplicationController

    def index
         @ab = Ab.find_by_title("XXXXXX")
             @cds = @ab.cds
                 for cd in @cds
                 logger.info cd.title
        end

我在视图中使用它。

显示视图

<%= @ab.title %>

我不知道如何显示属于该组的不同子组的标题和Dscr =“XXXXXX”

提前致谢

2 个答案:

答案 0 :(得分:0)

我认为你所要求的是这一点:

<% @ab.cds.each do |cd| %>
<h1><%= cd.title %></h1>
<p><%= cd.description %></p>
<% end %>

这在控制器中:

@ab = Ab.find_by_title("XXXXXX")

这样你就会显示匹配“XXXXXX”的ab模型的所有cds。

<强>更新 对于belongs_to和has_many来说,使用belongs_to的模型需要有一个具有has_many的列。在这种情况下,Cd需要有一个名为ab_id的列。

rails g migration add_ab_id_to_cds ab_id:integer

cd.ab_id需要是相应Ab模型的id。

cds = Cd.where(<something>)
cds.each do |cd|
  cd.ab_id = @ab.id
  cd.save
end

这可能应该在创建Cd对象时设置,但只是为了测试它你可以这样做。

答案 1 :(得分:0)

我是否必须创建连接表(ab_cd_join_table)

  

在这种情况下,您不需要连接表,而是需要添加   cds表中的ab_id列。(外键列应该出现在   定义belongs_to assiciation的模型表)

在视图中显示子组标题

<% @ab.cds.each |sub_group| %>
<%= sub_group.title -%>
<%= sub_group.description -%>
<%end%>

另外,如果你需要带有group的sub_groups,那么在find中使用include选项将它们加载到一个查询中

@ab = Ab.find_by_title("XXXXXX",:include=> :cds)

现在你不需要明确地计算cds只需使用上面提到的视图代码