寻求Ruby on Rails的帮助

时间:2012-11-05 19:22:23

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

我是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”?非常感谢你的帮助。

3 个答案:

答案 0 :(得分:1)

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

由于餐厅位置很多,你不能按照你提到的方式使用它。因为你有一个位置数组,实际上是一个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

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

问候!

答案 1 :(得分:1)

很好地涵盖了Rails关联here in the Rails Guides

我将引导您完成基本设置。

$ 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应用程序并尝试某种关联,还有一些需要连接模型。

答案 2 :(得分: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>