【问题标题】:Rails - Having multiple 'has_many through 'associations on the same modelRails - 在同一模型上有多个 'has_many 到 ' 关联
【发布时间】:2017-12-02 03:19:47
【问题描述】:

我正在开发一个用于注册露营者的 Rails 应用程序。首先,您使用您的姓名、电子邮件等进行注册。制作个人资料后,您可以注册一个营地。如果营地尚未满员,那么您将立即注册。如果它已满,那么您将被列入候补名单。现在我有 4 个模型:营员(姓名、电子邮件等)、营员(姓名、位置等)、注册和候补名单。 这个想法是让一个露营者能够注册到许多营地,显然一个营地有许多露营者注册或候补名单。这是我的课程:

# camper.rb
has_many :enrolled_in, :class_name => 'Camps', through: :enrollments, dependent: :destroy
has_many :waitlisted_in, :class_name => 'Camps', through: :waitlists, dependent: :destroy

# camp.rb
has_many :enrolled_campers, :class_name => 'Camper', through: :enrollments
has_many :waitlisted_campers, :class_name => 'Camper', through: :waitlists

我无法通过视图访问这些模型。下面是 show.html.erb 的样子:

<!-- Listing camps -->
<h2>Camps</h2>
<p>
  <strong>Name:</strong>
  <%= @camper.enrolled_in.name %> <!-- This is where I get the error -->
</p>

<!-- Adding camps -->
<h2>Add a camp:</h2>
<%= form_with(model: [@camper, @camper.enrolled_in.build ]) do |form| %>
<p>
  <%= form.label :name %><br>
  <%= form.text_field :name %>
</p>
<p>
  <%= form.submit %>
</p>
<% end %>

但我收到以下错误:

Campers#show 中的 ActiveRecord::HasManyThroughSourceAssociationNotFoundError

在模型注册中找不到源关联“enrolled_in”或 :enrolled_in。尝试 'has_many :enrolled_in, :through => :enrollments, :source => '。是camp还是camper之一?

老实说,我不知道出了什么问题。我对数据库和 Rails 还很陌生,所以请放轻松。

【问题讨论】:

    标签: html ruby-on-rails database web-applications associations


    【解决方案1】:

    关注 HABTM 协会的发展方向。

    1. 这将使您的代码更整洁。
    2. 您将拥有 :after_add 和 :after_destroy 操作,它们将始终跟踪模型更改(甚至直接插入外键,这与同名的 has_many 回调不同。)

    所以。

    class Camper
      has_and_belongs_to_many :waitlists, after_add: :check_camp_ready_to_start_as_example
      has_and_belongs_to_many :enrolllists
    end
    
    class Waitlist
      belongs_to :camp
      has_and_belongs_to_many :campers
    end 
    
    class Enrolllist
      belongs_to :camp
      has_and_belongs_to_many :campers
    end
    
    class Campl
      has_many :enrolllists
      has_many :waitlists
    end
    

    如何创建这样的迁移(需要创建连接表),可以阅读here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      • 2011-01-30
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      相关资源
      最近更新 更多