如何在rails中建立一对多的关系

时间:2016-01-18 12:05:15

标签: ruby-on-rails ruby-on-rails-4 relational-database rails-activerecord

这是我想要的:

-table Announce (id, title, description,..) 

-table city (id, name) 

-table Annouce_city (idAnnouce, idCity) 

创建一个annouce后,会自动将一行添加到Annouce_city表中,其中包含Announce id和所选的id city

所以现在我成功创建了一个one_to_many关系,但它不是我想要的,因为Annouce_city表应该有一次宣布,但是一个城市多次宣布。

谢谢!

class City < ActiveRecord::Base
validates :name, presence: true, length: { minimum: 3, maximum: 25 }
validates_uniqueness_of :name
end

class Annonce < ActiveRecord::Base
belongs_to :user
validates :marque, presence: true, length: {minimum: 2, maximum: 35 }
validates :couleur, presence: true, length: {minimum: 2, maximum: 35 }
validates :user_id, presence: true
mount_uploaders :imgs, ImgUploader
serialize :imgs, JSON
end

class AnnonceCity < ActiveRecord::Base
belongs_to :annonce
belongs_to :city
end

1 个答案:

答案 0 :(得分:1)

has_many :through

#app/models/announcement.rb
class Announcement < ActiveRecord::Base
   #id | title | description | etc
   has_many :announcement_cities
   has_many :cities, through: :announcement_cities
end

#app/models/announcement_city.rb
class AnnouncementCity < ActiveRecord::Base
   #id | annoucement_id | city_id
   belongs_to :announcement
   belongs_to :city
end

#app/models/city.rb
class City < ActiveRecord::Base
   #id | name | etc
   has_many :announcement_cities
   has_many :cities, through: :announcement_cities  
end

上述功能可让您为任意数量的announcement创建cities(基本上就是您已经拥有的):

#app/controllers/announcements_controller.rb
class AnnouncementsController < ApplicationController
   def create
      @city         = City.find params[:city_id]
      @announcement = @city.announcements.new announcement_params
      @announcement.save
   end
end

-

如果您想创建一个公告,并为每个城市进行复制,那么您需要制作一个自定义方法:

#config/routes.rb
resources :announcements do
   post :all_cities, on: :collection #-> url.com/announcements/all_cities
end

#app/controllers/announcements_controller.rb
class AnnouncementsController < ApplicationController
   def all_cities
      @announcement = Announcement.new announcement_params
      if @announcement.save
         @cities = City.all
         @cities.each do |city|
            city.announcements << announcement
         end
      end
   end
end