【问题标题】:Fetching data using one-many association使用一对多关联获取数据
【发布时间】:2011-12-12 06:27:19
【问题描述】:

我是新手。我有 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 %>

不知道如何显示属于组的不同子组的title和Dscr = "XXXXXX"

提前致谢

【问题讨论】:

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


    【解决方案1】:

    我认为您所要求的是视图中的这个:

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

    这在控制器中:

    @ab = Ab.find_by_title("XXXXXX")
    

    这样您将显示匹配“XXXXXX”的 ab-model 的所有 cd。

    更新: 要让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 对象时设置,但只是为了测试它,你可以这样做。

    【讨论】:

    • 您好 Frans,我尝试在视图中进行更改,但收到此错误消息 SQLite3::SQLException: no such column: cds.ab_id: SELECT "cds".* FROM "cds" WHERE" cds"."ab_id" = 1
    • 你在 Cd 中有一个名为 ab_id 的列吗?您需要这样才能让 Cd 知道它属于哪个 Ab。 rails g migration add_ab_id_to_cds ab_id:integer 应该是创建所需迁移的代码。然后你运行rake db:migrate
    • 啊,我错过了您询问是否需要连接表的部分。好吧,你没有。只是模型中具有“belongs_to”的 ab_id。
    • Frans 我在 cd 中创建了 ab_id 列。错误消失了,但我没有看到任何数据被提取。是的,我完全使用了你写的内容。
    • 啊,它不适用于现有记录,因为 ab_id 将为空。 ab_id 需要设置为其所属模型的对应id。我会稍微更新一下我的答案。
    【解决方案2】:

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

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

    在视图中显示子组标题

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

    另外,如果您一直需要带有组的 sub_groups,那么请使用 find like 中的 include 选项将它们加载到一个查询中

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

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

    【讨论】:

    • 你好,纳伦。我正在尝试与您所说的类似的东西。
    • 这个解决方案有帮助吗?或者你还需要什么?
    猜你喜欢
    • 2021-02-17
    • 2015-08-27
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多