Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 不确定我的应用程序需要哪种模型关联方法_Ruby On Rails_Ruby - Fatal编程技术网

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,并且只对关联您已经拥有的两个模型感兴趣,那么a
has_和_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