2014-09-22 48 views
-1

我是轨道开发人员的新人。请帮助我理解。 我有3个表: 电话,问题,结果钢轨关系。 Rails 4

电话是: ID,姓名,日期

问题是: ID,质疑

结果是: ID,CALL_ID ,question_id,结果

我读过Rails手册,据我了解,我创建了3个模型。

在我的模型Call.rb 我做下一关系:

has_many :results 
has_many :question, through: :results 

我Result.rb

belongs_to :call 
belongs_to :question 

我Question.rb

has_many :result 

因此,有可以是表中的许多记录“结果”,其中一个call_id,这是可以通过结果

有问题,一个关系。如果如果试图这样的启动代码:

@calls = Call.all 

比对我的看法:

<% @calls.each do |call| %> 
<%= call.result.result %> 
<% end %> 

我错误,“结果是未定义的方法”。但它必须是一个财产。

我做错了什么? 谢谢!

+0

你刚试过'<%= call.result%>'? – 2014-09-22 19:53:28

+0

但我在表格问题中没有字段** call_id **。 因此,对于我has_many:问题 - 这也是错的 – 2014-09-22 20:00:31

+0

如果我做了<%= call.result%> - 我错误: 未定义的方法'结果' – 2014-09-22 20:02:08

回答

1

根据您的模式,你的协会应该像这样

class Call < ActiveRecord::Base 
    has_many :questions 
    has_many :results 
end 

class Question < ActiveRecord::Base 
    belongs_to :call 
end 

class Result < ActiveRecord::Base 
    belongs_to :call 
end 

所以在视图中,

<% @calls.each do |call| %> 
    <% call.results.each do |result| %> 
    <%= result.result%> 
    <% end %> 
<% end %> 
+0

所以我需要做2个周期,这是解决方案。谢谢! – 2014-09-22 22:04:15

0

我注意到的第一件事是,你的电话应该有很多问题,很多结果通过问题。这是因为电话会有自己的问题,而这些问题本身也会产生结果。

class Call < ActiveRecord::Base 
    has_many :questions 
    has_many :results, through: :questions 
end 

您在Result类中不需要call_id。但是,如果你想保留在那里,你不需要通过你的通话类中的问题(因为它们之间有直接的关系)

在你的问题类中,我认为它是一个错字,但它应该是复数

has_many :results 

说了这么多,你的循环通过电话将给出带来的结果(复数),而不是结果(单数),一个电话可能有许多成果。因此:

<% @calls.each do |call| %> 
    <% call.results.each do |result| %> 
    <%= call.result %> 
    <% end %> 
<% end %> 
+0

nope,通过结果呼叫有很多问题.. – 2014-09-22 20:06:45

+0

对不起,我的pdated我的帖子,因为这是错误的架构描述 – 2014-09-22 20:08:02

+0

请看,新的架构描述 – 2014-09-22 20:09:49

1

有几件事。

首先,您需要修复您的关联,使复数和单数时态匹配。 Marcelo指出,has_many :result不起作用。

其次,您需要确保您的表实际上具有正确的ID以使关联正常工作。使用导轨控制台检查Result。从您的问题信息中,它应该具有call_idquestion_id的属性。一旦你确认了这一点,在控制台中创建一些对象并测试你的关联。

@call = Call.create(name: "test", date: Time.now) 

@result = Result.create(call_id: @call.id, result: "some result") 

然后

@call.result # should yield the Result record you just created 

最后,你需要重命名result属性为Result。这是超级混乱,只会导致问题。

+0

可以解释我请不同复数和单数? – 2014-09-22 21:45:15

+0

'has_many'意味着复数(即多于一个)。所以如果你打算使用'has_many',它需要使用':results'(复数)而不是'result'(单数)。 – settheline 2014-09-22 21:50:54

+0

啊这很简单,谢谢。现在我尝试修复并尝试您的解决方案! – 2014-09-22 21:59:30