我正在努力在我的网站上建立一个投资组合部分。我设置了一个投资组合有一个与之相关的类别。
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>
我记得之前使用过这种语法并且没有任何问题。任何帮助都会很棒。我试图在这里找到这个问题=但是无法使它们发挥作用。
答案 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
关联将Category
与has_one
相关联。但是,您还需要在Category
端指定关联。所以在你的Category.rb
模型类中,你需要写:
class Category < ActiveRecord::Base
belongs_to :portfolio
# other stuff
end
确保关联正常运行还有一个步骤。您需要确保数据库中的categories
表具有名为portfolio_id
的字段。如果确实如此,那么你应该好好去!如果没有,则执行以下操作:
rails generate migration addPortfolioIdToCategory
打开迁移文件并确保其如下所示:
def change
add_column :categories, :portfolio_id, :integer
end
rake db:migrate
醇>
如果您重新加载服务器,则应解决您的问题!
指定belongs_to
关联的模型必须在相应的数据库表中具有主键属性。在您的情况下,如果Category
模型具有belongs_to
关联,则categories
数据库表必须包含标题为portfolio_id
的字段。
答案 2 :(得分:0)
它的抱怨portfolio_id并不存在于您的类别表中。验证您的迁移文件的类别。鉴于外键是在类别上设置它应该工作。 Rails has one association