从连接表访问数据

时间:2014-07-14 04:21:03

标签: ruby-on-rails ruby

class Address < ActiveRecord::Base
  has_many :restaurant_address
  has_many :restaurant, through: :restaurant_address
end

class Restaurant < ActiveRecord::Base
  has_many :restaurant_address
  has_many :address, through: :restaurant_address
end

class Restaurant_Address > ActiveRecord::Base
  belongs_to :address
  belongs_to :restaurant
end

如你所见,我有3张桌子。到目前为止,插入数据在单个表上运行良好。但是,我没有在Restaurant_Address表上得到我需要的关联。如何设置我的控制器,以便当我插入新的餐厅和地址时,它们会自动在Restaurant_Address表中关联?

3 个答案:

答案 0 :(得分:0)

Active Record在很大程度上依赖于约定。 has_many关联使用复数形式的单词,因此它应该是:

class Address < ActiveRecord::Base
  has_many :restaurant_addresses
  has_many :restaurants, through: :restaurant_addresses
end

class Restaurant < ActiveRecord::Base
  has_many :restaurant_addresses
  has_many :addresses, through: :restaurant_addresses
end

class RestaurantAddress < ActiveRecord::Base
  belongs_to :address
  belongs_to :restaurant
end

另外,请注意在RestaurantAddress类上更改为CamelCase,这也是模型的约定。该约定假设您的表:restaurant_addresses具有外键address_id和restaurant_id! ActiveRecord指南很棒,你可以搞砸它here

答案 1 :(得分:0)

has_many:通过

The Brofessor的回答之后,您将确保您了解has_many :through协会:

enter image description here

虽然您的关联看起来像他们正确设置,但我建议您在课程命名方面遇到问题。类名由CamelCase处理,文件名由snake_case

处理

因此,正如The Brofessor指出的那样,您需要这样做:

#app/models/restaurant_address.rb
Class RestaurantAddress < ActiveRecord::Base
   ...
end

数据

在访问数据的意义上,如果你有你的模型&amp;表格设置正确,您需要确保设置数据以正确管理它:

#app/controllers/restaurants_controller.rb
Class RestaurantsController < ApplicationController
   def show
        @restaurant = Restaurant.find params[:id]
        @restaurant.assresses #-> yields object with addresses inside
   end
end

-

<强>协会

最后,我注意到您的address关联已被单独声明。

虽然我对此并不是100%肯定,但我会说地址关联必须是复数,或者至少如果你要使其成为单数,你应该拥有{{1} }参数定义

为了保证安全,我会将class_name协会复数:

address

答案 2 :(得分:0)

感谢所有答案。我只是放弃了这个模型,并使用嵌套方法技术进行了更多的“轨道”方法。但我确实从我所看到的东西中学到了很多东西,并意识到我的设计模式虽然可行但在目前的知识水平上是无法实现的。再次感谢大家。