这是我想要的:
-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
答案 0 :(得分:1)
#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