Rails 4 has_many 个问题

Rails 4 has_many issue

我有以下内容:

在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 获取 scout "owned" 的名字,所以在 parent_controller.rb 中我有:

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

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

基本上,如何在 parent 模型中 return 模型上的 scout 单个属性?例如,我想要一个 scout 的名字,其 ID 与给定的 parent 相匹配。但是当我这样做时,我认为:

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

我明白了

undefined method `fname' for nil:NilClass

我意识到这是非常初级的 Rails,但我并不经常像这样构建多用户系统。任何可能阐明 has_many 关系的帮助或信息都将受到赞赏。

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

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

您已找到父对象并存储到 @parent。然后,您获取它的 ID,将其存储在 @id 中,然后查找所有 Scoutscout_id == @id(内容为 give me all scout's who'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 而不是 parents.