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