Rails 4 - has_one - 无法访问相关模型的属性

时间:2013-12-08 15:53:56

标签: ruby-on-rails ruby-on-rails-3 postgresql activerecord ruby-on-rails-4

我正在尝试开发一个小型的Rails 4应用程序,但我遇到了一些麻烦 - 从旧的Rails版本中有很多不同的东西。

当我尝试获取相关模型的属性时,收到PG::UndefinedColumn:错误。相关模型与has_one关系相关联,但我会更好地解释我的模型。


现在我有以下架构:

网站(官方,这称为“项目”):

  • ID
  • 名称
  • 描述
  • URL
  • country_id(国家/地区FK)
  • category_id(类别FK)

分类

  • ID
  • 名称

国家:

  • ID
  • 名称

网站模型:

has_one :country
accepts_nested_attributes_for :country

has_one :category 
accepts_nested_attributes_for :category

国家和类别模型(两者都是等于):

has_many :site

迁移:

    # timestamp_add_column_idcountry_to_site
    # Adding reference (Foreign Key) of country to Site (Now Site will have a country_id field).
    add_reference :sites, :country, index: true

    # timestamp_add_column_idcategory_to_site
    # Adding reference (Foreign Key) of category to Site (Now Site will have a category_id field).
    add_reference :sites, :category, index: true

我的观点:

<%= @category.site.each do |store| %>
    <h1>Name: <%= store.name %></h1>
    <h3>Country: <%= store.country.name %> </h3>
<% end %>

错误:

(在店内。 country.name

PG::UndefinedColumn: ERROR:  column countries.site_id does not exist
LINE 1: SELECT  "countries".* FROM "countries"  WHERE "countries"."i...
                                                      ^
: SELECT  "countries".* FROM "countries"  WHERE "countries"."site_id" = $1  ORDER BY "countries"."id" ASC LIMIT 1

您还需要其他信息吗?如果是,请告诉我,我会尝试更快地编辑问题。 如何访问“site.country.name”属性?

P.S:我已经看到了thisthis的问题。

2 个答案:

答案 0 :(得分:3)

您的Site#has_one :country需要Site#belongs_to :country

答案 1 :(得分:3)

正如janfoeh所指出的,您的站点模型中应该包含以下代码:

belongs_to :country
belongs_to :category

这样,您可以Site.find(1).country返回网站的国家/地区,或Country.find(1).sites返回在某个国家/地区找到的所有网站。

如果您想执行“has_one”路线,您的数据模型应如下所示:

网站:

  • ID
  • 名称
  • 描述
  • URL

类别:

  • ID
  • 名称
  • SITE_ID

国家:

  • ID
  • 名称
  • SITE_ID

您还应该更改国家/地区和类别模型的代码:

belongs_to :site