Ruby on rails 不确定我的应用程序需要哪种模型关联方法
到目前为止我拥有的:Ruby on rails 不确定我的应用程序需要哪种模型关联方法,ruby-on-rails,ruby,Ruby On Rails,Ruby,到目前为止我拥有的: class Organization < ActiveRecord::Base belongs_to :user has_many :events has_many :vips end class Event < ActiveRecord::Base belongs_to :organization has_many :vips end class Vip < ActiveRecord::Base belongs
class Organization < ActiveRecord::Base
belongs_to :user
has_many :events
has_many :vips
end
class Event < ActiveRecord::Base
belongs_to :organization
has_many :vips
end
class Vip < ActiveRecord::Base
belongs_to :organization
belongs_to :event
end
<%= form_for [@organization, @event] do |f| %>
<p>
<%= f.label :when %>
<%= f.date_select :when %>
</p>
<p>
<%= f.label :name %>
<%= f.text_field :name %>
</p>
<p>
<%= f.label :vip %>
<%= f.select :vip_id, options_for_select(@organization.vips.all.map {|v| [v.name, v.id]}) %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
<Organization id: 1, name: "Test Org", created_at: "2015-08-25 04:46:03", updated_at: "2015-08-25 04:46:03", user_id: 1>
<Event id: 1, when: "2015-08-25 00:00:00", organization_id: 1, created_at: "2015-08-25 04:47:43", updated_at: "2015-08-25 04:47:43", name: "John's Event", vip_id: 1>
<Vip id: 1, name: "Captain", created_at: "2015-08-25 04:46:23", updated_at: "2015-08-25 06:51:47", organization_id: 1>
它返回=>nil
好的,现在我运行一个rails迁移,向VIP添加一个event_id列,并在console中手动填充它,以便它指向组织的第一个事件(event_id=1),当我运行相同的代码时,我得到:
@organization = Organization.find(1)
@event = @organization.events.first
@event.vips.first
=> #<Vip id: 1, name: "John", created_at: "2015-08-25 04:46:23", updated_at: "2015-08-25 06:51:47", organization_id: 1, event_id: 1>
@organization=organization.find(1)
@event=@organization.events.first
@事件。贵宾优先
=> #
这是一个问题,因为我不能让我的VIP仅与一个事件关联。我需要它们能够与几十个事件关联,这样我就可以通过块代码访问它们,例如
<% @events = @organization.events.all %>
<% @events.each do |event| %>
<%= event.name %>
<% event.vips.each do |vip| %>
<%= vip.name %>
<% end %>
<% end %>
听起来你在试图建立一种多对多的关系,而不是像现在这样的一对多关系。如果你看一下导轨,他们会详细解释这一点。基本思想是有第三个表来定义事件和vip之间的所有关系。此表通常有一列表示事件id,一列表示vip id。表中的每一行都是一个关联,因此您可以列出同一vip或事件的多个关联 这将允许您调用
event.vips
甚至vip.events
实际上,有两个选项可以获得多对多关系,您可以使用has\u和\u belish\u to\u many
,或者has\u many:through
。指南中也概述了这些差异,但概括起来,如果您需要将其他信息或方法附加到关系本身,您可以使用has_many:through
。在这种情况下,它被视为自己的独立实体或模型。如果您对此没有ned,并且只对关联您已经拥有的两个模型感兴趣,那么ahas_和_besign_to_many
更易于使用,只需要数据库中的表
拥有并且属于许多人
class Event < ActiveRecord::Base
has_and_belongs_to_many :vips
end
class VIP < ActiveRecord::Base
has_and_belongs_to_many :events
end
class事件
有很多:通过
class Event < ActiveRecord::Base
has_many :event_vip_list
has_many :vips, through: :event_vip_list
end
class Vip < ActiveRecord::Base
has_many :event_vip_list
has_many :events, through: :event_vip_list
end
class EventVipList < ActiveRecord::Base
belongs_to :event
belongs_to :vip
end
class事件
听起来你可能想要
class Organization < ActiveRecord::Base
has_many :vips
class Event
has_many :event_vips
has_many :vips, :through => :event_vips
class EventVip < ActiveRecord::Base
belongs_to :event
belongs_to :vip
class Vip < ActiveRecord::Base
belongs_to :organization
has_many :events_vips
has_many :events, :through => :event_vips
类组织:事件\u VIP
类EventVip:事件\u贵宾
这将使VIP成为单个组织的子组织,并能够连接多个活动。非常感谢!在控制台中,如果我手动创建并
update\u attributes
一个event\u vips
对象,我现在可以以我尝试的方式访问vip属性。但是,我想我还是有点困惑,如何从应用程序(在浏览器中)填充event_vips表。我需要创建另一个控制器吗?我需要创建一个完全不同的表单吗?因为该活动有很多vip,您可以使用一个很棒的方法vip\u id=
将其设置为数组。您可以通过复选框轻松创建多选ui-这将提交一组vip ID,您可以将其分配给活动。
class Organization < ActiveRecord::Base
has_many :vips
class Event
has_many :event_vips
has_many :vips, :through => :event_vips
class EventVip < ActiveRecord::Base
belongs_to :event
belongs_to :vip
class Vip < ActiveRecord::Base
belongs_to :organization
has_many :events_vips
has_many :events, :through => :event_vips