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
表中关联?
答案 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
协会:
虽然您的关联看起来像他们正确设置,但我建议您在课程命名方面遇到问题。类名由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)
感谢所有答案。我只是放弃了这个模型,并使用嵌套方法技术进行了更多的“轨道”方法。但我确实从我所看到的东西中学到了很多东西,并意识到我的设计模式虽然可行但在目前的知识水平上是无法实现的。再次感谢大家。