在 has_many 关联中添加数据
Posted
技术标签:
【中文标题】在 has_many 关联中添加数据【英文标题】:Adding data in an has_many association 【发布时间】:2015-03-09 16:04:14 【问题描述】:我的项目由人物、事件和评论组成。
用户可以发布 cmets(不需要帐户)并可以参加活动。
我在人员和事件之间使用has_many: through
关联,但无论我尝试什么,我都无法将人员添加到事件中。
我不知道如何选择某人并将此人添加到 event_people
表中。
模型
class EventPeople < ActiveRecord::Base
belongs_to :event
belongs_to :people
end
class Event < ActiveRecord::Base
validates :title, presence:true, length: minimum: 3
validates :date_from, presence:true
validates :date_to, presence:true
validates :time_from, presence:true
validates :time_to, presence:true
has_many :comments, dependent: :destroy
has_many :people, :through => :event_people
has_many :event_people
end
class People < ActiveRecord::Base
validates :name, presence: true
validates :email, presence: true, length: minimum: 5
validates :birthdate, presence: true
has_many :comments
has_many :events, :through => :event_people
has_many :event_people
end
显示来自事件控制器的方法
def show
@event = Event.find(params[:id])
end
桌子
create_table "event_people", force: true do |t|
t.integer "event_id"
t.integer "people_id"
t.datetime "created_at"
t.datetime "updated_at"
end
【问题讨论】:
你想怎么做?是有人添加自己还是由创建事件的人添加人员? 任何人都应该能够添加在数据库中注册的任何人。这可能很容易实现,但我已经盯着这个看了很长一段时间,我还没有弄清楚我应该做什么 【参考方案1】:删除
has_many :event_people
在您的人员和事件类中
您的迁移应该如下所示:
create_table "event_people" do |t|
t.belongs_to :event
t.belongs_to :people
t.timestamps
end
【讨论】:
如果我进行这些调整,我应该如何选择某人并将其添加到将参加此活动的人员列表中?people.events.build
将向现有人员添加事件,反之亦然 events.people.build
将人员添加到事件。当然你必须通过一些代码来识别人和事件。【参考方案2】:
您可以按照 klausinho 的建议单独添加他们,有一个 EventPeople
的来自,您可以一次添加一个人。
或者has_many
关联将为您提供有关事件的people_ids=
方法。所以你可以使用collection check boxes
<%= form_for @event do |f| %>
<div class="field">
<%= f.collection_check_boxes(:people_ids, People.order(:name), :id, :name)
</div>
<% end %>
或者您可以使用多选代替。
【讨论】:
以上是关于在 has_many 关联中添加数据的主要内容,如果未能解决你的问题,请参考以下文章
如何在父应用程序模型和挂载引擎模型之间设置has_many关联?