【问题标题】:Rails has one associationRails 有一个关联
【发布时间】:2017-05-19 03:16:40
【问题描述】:

我现在正在我的网站上建立一个投资组合部分。我设置了一个投资组合有一个与之相关的类别。

class Portfolio < ApplicationRecord
  has_one :category
end

我正在尝试访问组合的显示视图中的类别属性名称,但出现此错误。

SQLite3::SQLException: no such column: categories.portfolio_id: SELECT  "categories".* FROM "categories" WHERE "categories"."portfolio_id" = ? LIMIT ?

这是视图中的内容:

<li><i class="icon_link"></i><span>Category: </span><%= @portfolio.category.name %></li>

我记得以前使用过这种语法并且没有任何问题。任何帮助都会很棒。我试图在这里找到这个问题=,但无法使它们起作用。

【问题讨论】:

  • 您确定更好的关联不会是与 Category 的 belongs_to 关联吗?所以 Portfolio belongs_to :category 和 Category has_many :portfolios。那么你的观点就会起作用。

标签: ruby-on-rails associations rails-activerecord


【解决方案1】:

has_one/belongs_to 关联的 Rails 常规命名是 - 如果您在 Portfolio 中有 category_id 列,则“一个投资组合属于一个类别”和“一个类别有一个投资组合”。您需要将模型重写为:

class Portfolio < ApplicationRecord
  belongs_to :category

class Category < ApplicationRecord
  has_one :portfolio

之后@portfolio.category.name 应该可以正常工作了。

更新:可能是“一个类别有很多投资组合”,当模型将是:

class Portfolio < ApplicationRecord
  belongs_to :category

class Category < ApplicationRecord
  has_many :portfolio

【讨论】:

【解决方案2】:

只要您在 Rails 中有关联,就必须至少有两个实体(或模型)参与该关联。在您的特定情况下,您已通过 has_one 关联将 PortfolioCategory 关联。但是,您还需要在 Category 端指定关联。所以在你的Category.rb模型类中,你需要写:

class Category < ActiveRecord::Base
  belongs_to :portfolio    
  # other stuff
end

还有一个步骤可以确保关联正常工作。您需要确保数据库中的categories 表有一个名为portfolio_id 的字段。如果是这样,那么你应该很高兴!如果没有,则执行以下操作:

  1. 在终端中输入rails generate migration addPortfolioIdToCategory

  2. 打开迁移文件并确保它看起来像这样:

    def change
      add_column :categories, :portfolio_id, :integer
    end 
    
  3. 现在从你的终端运行rake db:migrate

如果你重新加载你的服务器,你的问题应该解决了!

注意

指定belongs_to关联的模型在对应的数据库表中必须有主键属性。在您的情况下,如果Category 模型具有belongs_to 关联,则categories 数据库表必须具有标题为portfolio_id 的字段。

【讨论】:

    【解决方案3】:

    抱怨您的类别表中不存在portfolio_id。验证您的迁移文件的类别。鉴于在类别上设置了外键,它应该可以工作。 Rails has one association

    【讨论】:

    • 它不存在,因为我的投资组合中只有 category_id
    • 我链接了文档,以便您查看示例。如果您想要 has_one :您的投资组合模型上的类别,您应该将portfolio_id 移动到类别表中
    • 类别数据库只是所有类别的列表,然后我用 category_id 引用它在投资组合记录中的哪个类别
    • 听起来你想使用belongs_to :category 而不是has_one
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    相关资源
    最近更新 更多