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
中,然后查找所有 Scout
的 scout_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.
我有以下内容:
在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
中,然后查找所有 Scout
的 scout_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.