Rails有一个关联

时间:2017-05-19 03:16:41

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

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

class Portfolio < ApplicationRecord
  has_one :category
end

我正在尝试访问投资组合的show视图中的类别属性名称,但是我收到此错误。

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>

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

每当你在rails中有关联时,必须至少有两个entites(或模型)参与该关联。在您的特定情况下,您已通过Portfolio关联将Categoryhas_one相关联。但是,您还需要在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. 现在从您的终端
  4. 运行rake db:migrate

    如果您重新加载服务器,则应解决您的问题!

    注意

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

答案 2 :(得分:0)

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