【问题标题】:ruby on rails - after establishing many to many connection - how do I display dataruby on rails - 建立多对多连接后 - 我如何显示数据
【发布时间】:2012-04-27 16:23:41
【问题描述】:

在这个网站的帮助下,我建立了多对多的关系。
我在模型中添加了 has_and_belongs_to_many
现在我想在屏幕上显示来自该对象的数据
我想我应该在 html.erb
假设我希望它出现在索引表单和编辑/新表单中

我该如何呈现呢? 谢谢。

编辑:
我有两个对象:
即人和状态 - 一个人可以有许多状态)
我希望有一个屏幕可以显示此人的所有状态,而另一个屏幕可以向他添加其他状态。
正如我提到的,我创建了这样的 rb 脚本(两者都适用)

class CreateStates < ActiveRecord::Migration
def change
  create_table :states do |t|
    t.string :name
    t.timestamps
  end
 end
end

和一个连接表

def up
  create_table 'persons_states', :id => false do |t|
  t.integer :persons_id
  t.integer :states_id
end

结束 并在模型中添加了 has_and_belongs_to_many :ingredients

如何更新我的 gui 代码? 谢谢

【问题讨论】:

  • 我认为您需要展示更多关于如何建立关系的信息。否则,您可能只想使用has_manybelongs_to。我们怎么知道不要从您的问题中提出这个建议?
  • 谢谢 - 添加了一些数据
  • 我无法理解states 的用途。这太模棱两可了。即使您在问题中添加了数据,它仍然是模棱两可的。我看不出origin_idingredient_id 与您的states 表有什么关系。在 rails 中,您在模型中设置关系。有人可以为您提供阅读关联指南的简单答案,这对他有好处,也许他会获得支持(不是来自我),但您的问题需要更多努力 - 无论如何都要阅读指南。

标签: ruby-on-rails associations relationship has-and-belongs-to-many


【解决方案1】:

Kulgar 的回答涉及建立关系,这是正确的。有了这些,您可以在视图中显示如下信息:

<%= @person.name %>
<ul>
  <% @person.states.each do |state| %>
    <li><%= state.name %></li>
  <% end %>
</ul>

这假设您有一个适当的控制器操作,将@person 设置为Person 类的一个实例。也许是这样的:

def show
  @person = Person.find(params[:id])
end

你可以更进一步,添加一个局部视图来显示 State 类,然后在你的视图中引用它:

<%= @person.name %>
<% @person.states.each do |state| %>
  <%= render state %>
<% end %>

这将使用 _state.html.erb 渲染部分并将局部变量状态传递给它。

所有这一切的重要部分是@person.states 将引用与此人相关联的状态:)

【讨论】:

    【解决方案2】:

    你应该看看这个指南:Associations - Has and belong to many official guide

    如果没有与此关联绑定的模型/资源的名称,我无法进一步帮助您。如果您想要更准确的答案,请提供。

    好的,在您编辑问题之前已回答。

    因此,您希望在 Person 和 States 模型之间建立“has_and_belong_to_many”关联。所以在你的“人”模型中你应该有:has_and_belongs_to_many :states。在您的“状态”模型中,您应该有: has_and_belongs_to_many :people (人的复数)。您具有“has_and_belongs_to_many”关联的连接表必须是“people_states”,因为这是一个约定,所以您实际上没有选择权。

    您还可以查看official documentation,它提供了有用的信息。

    【讨论】:

    • 我不确定 Rails 如何在其约定中使用“人”的复数形式。我希望它确实知道人的复数形式是人。在处理模型和约定时,我不确定它是否知道..
    • 我不确定他是否真的想要在这种情况下拥有一个连接表,但对编辑您的解决方案以解释他应该如何使用它进行投票
    【解决方案3】:

    如果你有一个可以有多个状态的 Person,它很简单:

    型号 人.rb

    has_many :states
    

    state.rb

    belongs_to :person
    

    您生成的迁移:

    rails generate model State person_id:integer name:string
    rails generate model Person name:string
    

    如果您需要将此person_id 外键添加到该人,只需执行以下操作:

    rails generate migration Add_Person_ID_To_States person_id:integer
    rake db:migrate
    

    通常不需要has_and_belongs_to_many

    【讨论】:

    • 嘿,你的权利,我应该考虑这个解决方案!我也会投票给你的答案。 ;)
    • 除非状态可以在人与人之间共享。例如,如果州是美国的州,并且他试图建立人们访问过的州的历史,那么 has_and_belongs_to_many 关系是有意义的。
    • 我喜欢这个例子,谢谢。我想这取决于他的解释是什么
    猜你喜欢
    • 2016-02-23
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2017-01-25
    相关资源
    最近更新 更多