gpt4 book ai didi

ruby-on-rails - 连接表的 ListView

转载 作者:行者123 更新时间:2023-11-29 13:54:22 25 4
gpt4 key购买 nike

如图所示有一个 has_many 加入的数据库

class Address < ActiveRecord::Base
has_many :years, dependent: :destroy
has_many :people, through: :years
end

class Year < ActiveRecord::Base
belongs_to :address
belongs_to :person
end

class Person < ActiveRecord::Base
has_many :years, dependent: :destroy
has_many :addresses, through: :years
end

我在使用 Years 的 ListView 时遇到问题,即 Views>Years>list.html.erb

这是一个不起作用的示例:

# table headers here
<% @years.each do |y| %>
<tr>
<td><%= y.year_date %></td>
<td><%= y.person_id %></td>
<td><%= y.person.given_name %></td>
<td><%= y.person.last_name %></td>
...
<% end %>

year_date 是地址中的人的日期,如果 given_namelast_name 行不存在,则显示正常。year.person_id 也显示得很好。但是 year.person.given_nameyear.person.last_name 不显示。 given_namelast_name 是 Person 表中的字段。

错误是undefined method given_name for nil:NilClass

显然有点菜鸟,否则这会更明显。部分问题可能在于如何对搜索进行措辞。

完整代码在这里:https://bitbucket.org/MtnBiker/crores5

感谢您的建议。找了好几天了。

编辑:环顾四周开始怀疑外键,这是我通过 pgAdmin 在数据库中找到的内容。

ALTER TABLE people
ADD CONSTRAINT fk_rails_56c79562d9 FOREIGN KEY (address_id)
REFERENCES addresses (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION;

编辑2.添加 Controller :

class YearsController < ApplicationController
helper_method :sort_column, :sort_direction
before_action :set_year, only: [:show, :edit, :update, :destroy]

def index
@years = Year.all
@years = Year.order(sort_column + " " + sort_direction)
end

架构?

CREATE TABLE years
(
id serial NOT NULL,
year_date date,
created_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL,
resto boolean,
resid boolean,
source text,
person_id integer,
address_id integer,
title character varying,
CONSTRAINT years_pkey PRIMARY KEY (id),
CONSTRAINT fk_rails_8fc1813509 FOREIGN KEY (person_id)
REFERENCES people (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT fk_rails_e1624dbb3f FOREIGN KEY (address_id)
REFERENCES addresses (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE years
OWNER TO gscar;

-- Index: index_years_on_address_id

-- DROP INDEX index_years_on_address_id;

CREATE INDEX index_years_on_address_id
ON years
USING btree
(address_id);

-- Index: index_years_on_person_id

-- DROP INDEX index_years_on_person_id;

CREATE INDEX index_years_on_person_id
ON years
USING btree
(person_id);

编辑:在这个漫长(抱歉)的讨论结束时给出了答案。

最佳答案

undefined method given_name for nil:NilClass

这意味着您正在对一个 undefined variable 调用 given_name。在你的例子中,person.given_name

问题是或者您没有关联的 person 对象(IE 不存在),或者关联设置不正确。

--

调试的几个步骤:

  1. 是否填充了 person_id
  2. 您的模式设置是否正确?

最可能的问题是您的 person_id ( foreign key ) 值不存在。您将能够通过使用 rails console 看到这一点测试值是否存在:

$ rails c
$ years = Year.all
$ years.each do |year|
$ - year.person_id
$ end
$ -> output of person_id values

如果您没有 person_id 的值,则意味着您的 Year 无法与适当的 Person 相关联(因此您的问题)。要修复它,您需要确保拥有 respective foreign keys & objects出现在您的数据库中:

#app/models/year.rb
class Year < ActiveRecord::Base
belongs_to :address
belongs_to :person

validates :person, :address, presence: true
end

-

started wondering about foreign keys

这似乎不是问题(我检查了你的迁移):

enter image description here

上面显示了 has_many :through 所需的唯一外键应该是 address_id & person_id in your Year 模型。除非 Model 具有 belongs_to,否则表中不需要 foreign_key


更新

修复是使用 .try :

#app/views/years/index.html.erb
...
<%= y.person.try(:given_name) %>

关于ruby-on-rails - 连接表的 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35108784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com