在 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 关联中添加数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 中通过 has_many 添加附加属性

如何在父应用程序模型和挂载引擎模型之间设置has_many关联?

如何通过关联在 has_many 中使用回调?

如何通过“has_many”关联获取数据?

带有has_many的模型中的属性总和:通过关联在Rails 5中不起作用

has_many 与非传统数据模型的关联