Rails 4 has_many问题

时间:2015-01-14 02:21:25

标签: ruby ruby-on-rails-4 rails-activerecord

我有以下内容:

在parent.rb中

class Parent < ActiveRecord::Base

  attr_accessor :parent_id
  has_many :scouts

  # Friendly ID
  extend FriendlyId
  friendly_id :full_name, :use => :slugged

  # Synthesize fullname for use by FriendlyID
  def full_name
    "#{fname}-#{lname}"
  end
  def pretty_name
    "#{fname} #{lname}"
  end

end
scout.rb中的

class Scout < ActiveRecord::Base

  attr_accessor :scout_id, :fname, :lname
  belongs_to :parents
  has_many :insignia

  # Friendly ID
  extend FriendlyId
  friendly_id :full_name, :use => :slugged

  # Synthesize fullname for use by FriendlyID
  def full_name
    "#{fname}-#{lname}"
  end

  def pretty_name
    "#{fname} #{lname}"
  end
end

我想获得父母所拥有的侦察兵的第一个名字,所以在parent_controller.rb我有:

  def show
    @parent = Parent.friendly.find(params[:id])
    @id = @parent.id
    @scout  = Scout.where(:scout_id => @id).all
  end

由于我将scout的ID存储在父模型中,因此我在id中创建了一个变量来匹配。否则,id永远不会匹配,因为在这种情况下,params [:id]是一个友好的id slug。

基本上,如何在父模型中的侦察模型上返回单个属性?例如,我想要一个id匹配给定父级的侦察兵的名字。但是当我在我看来这样做时:

<p>
  <strong>Child:</strong>
  <%= @scout.fname %>
</p>

我得到了

undefined method `fname' for nil:NilClass

我意识到这是非常基本的Rails,但我不常常建立像这样的多用户系统。任何有助于阐明has_many关系的帮助或信息都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

您的控制器代码存在问题:

  def show
    @parent = Parent.friendly.find(params[:id])
    @id = @parent.id
    @scout  = Scout.where(:scout_id => @id).all
  end

您已找到父对象并存储到@parent。然后,您可以获取它的ID,将其存储在@id中,然后查找所有Scout scout_id == @id的{​​{1}}(这些内容会给我所有的侦察和&#39} #39; s的ID == parent_id)。我想你在这里要做的是:

  def show
    @parent = Parent.friendly.find(params[:id])
    @id = @parent.id
    @scout  = Scout.where(:parent_id => @id)
  end

这可以进一步重构:

  def show
    @parent = Parent.friendly.find(params[:id])
    @scouts  = @parent.scouts
  end

现在@scouts是一个数组,因此在您的视图中,您希望使用类似#each方法的方式遍历它。

更新

正如我们的聊天中所讨论的那样,需要先进行一些清理工作。删除Scout和Parent模型中的attr_accessor行。 Scout模型还需要belongs_to:parent而不是parent。