1

我是 Ruby on Rails 的新手。我只是在现有数据库上构建 Web 应用程序。我使用 rails 为餐厅和位置表生成 2 个脚手架。之后,我为这两个表设置了关系:

 class Restaurant < ActiveRecord::Base
  attr_accessible :created, :cuisine_fk, :dish_keywords, :dish_names, :factual_id, :first_name, :last_name, :name, :status


  has_many :locations 
end

class Location < ActiveRecord::Base
  attr_accessible :address1, :address2, :city, :created, :latitude, :longitude, :phone, :restaurant_fk, :state, :status, :url, :zip

  belongs_to :restaurant
 end

在为这些表设置此关系后,我没有使用“rake db:migrate”,因为我担心此操作会更改现有表。

当我运行这个命令行

<%= restaurant.location.address1%> 

它显示错误:

undefined method `location'

" NoMethodError in Restaurants#index

Showing C:/Sites/Dishclips/app/views/restaurants/index.html.erb where line #52 raised:

undefined method `location' for #<Restaurant:0x5853bb8> "

之后我尝试为文件设置外键:

class Location < ActiveRecord::Base
  attr_accessible :address1, :address2, :city, :created, :latitude, :longitude, :phone, :restaurant_fk, :state, :status, :url, :zip

  belongs_to :restaurant, :class_name => "Restaurant", :foreign_key => 'restaurant_fk'
 end

但它仍然不起作用。

在为表设置关系之后,有什么方法可以设置外键而不是使用“rails db:migrate”?我非常感谢你的帮助。

4

3 回答 3

1

Rails指南中很好地介绍了 Rails 关联。

我将在这里向您介绍基本设置。

$ rails generate model Restaurant name owner ...
$ rails generate model Location restaurant_id:integer city ...

然后,您需要迁移数据库以rake db:migrate使数据库表更改生效。

restaurant_id 允许我们在模型中设置关联,如下所示

class Restaurant < ActiveRecord::Base
  has_many :locations, dependent: :destroy
  attr_accessible :name, :owner
end

class Location < ActiveRecord::Base
  belongs_to :restaurant
  attr_accessible :city  # no restaurant_id here
end

现在您可以按如下方式访问您的餐厅位置。

r = Restaurant.create!(name: '...')
l = Location.create!(city: '...')

# Add association
r.locations << l

r.locations will now return an Array with l in it

l.restaurant will return r

尝试使用不同样式的关联,例如通过快速创建新的 Rails 应用程序并尝试某种关联,还有一些需要连接模型的关联。

于 2012-11-05T20:35:48.113 回答
1

问题是您错误地使用了位置。

由于餐厅 has_many 位置,您不能按照您提到的方式使用它。因为您有一个位置数组,实际上是一个 ActiveRecord 关系,所以为了访问关联的项目之一,您必须执行查询并获取其中一个元素。这是如何获取第一个元素的示例。

restaurant.locations.first.address1

如果餐厅只有一个位置,那么您应该将模型更改为

class Restaurant < ActiveRecord::Base
  attr_accessible :created, :cuisine_fk, :dish_keywords, :dish_names, :factual_id, :first_name, :last_name, :name, :status


  has_one :locations 
end

并像您一样访问该属性:

restaurant.location.address1

此外,我假设您的数据库具有您指定的列,否则您必须运行迁移。

问候!

于 2012-11-05T19:58:07.747 回答
0

现在我尝试这种方式,然后它可以工作。非常感谢。

<td> 
      <% restaurant.locations.search(params[:restaurant_fk]).each do |location| %>
         <!--address =  <%= location.address1 %> + " " + <%= location.address2 %>-->

         <%= location.address1 %> 
         <%= location.address2 %> ,
         <%= location.city %> ,
         <%= location.state %> ,
         <%= location.zip %> 

      <% end %> 
</td>
于 2012-11-06T21:05:56.153 回答