2011-09-28 68 views
2

我有三个表User,User_types和Purchases。导轨链接表belongs_to或has_many不工作

  • 用户: ID等

  • user_purchase_types:ID,类型名称,user_id说明

  • 采购: ID,USER_ID,user_purchase_type_id,注意

用户ca n有任何数量的购买和user_types。购买可以有一个user_purchase_type。

用户可以登录,创建类型,不要购买等等 - 这一切工作清单采购时,看到user_purchase_types.typename,而不是ID号精细

不过,我想,。简单的说,我认为,使用belongs_to,他们已经有了正确的id字段,应该可以工作。但它没有

我试过一百万个belongs_to,has_many,has_many等变体等,但无法获得正确的关系,因此显示的是typename而不是id。

表中有正确的foreign_key id字段,所以这应该工作。

在购买控制器中列出采购时,我使用@purchase = current_user.purchases。 当循环显示在视图中时,我认为我应该能够使用purchase.user_purchase_type.typename,但这给了我一个'NoMethodError'。

我在做什么错,或者我应该对数据库进行denormalise并完成它?

编辑模型作为REQ

class UserPurchaseType < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :purchase 
    attr_accessible :typename, :id 
end 

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 

    has_many :purchases, :dependent => :destroy 
    has_many :user_purchase_types, :dependent => :destroy 
end 

class Purchase < ActiveRecord::Base 
    belongs_to :user 
    has_many :user_purchase_types 
    attr_accessible :date, :user_purchase_type_id, :note 
end 

index.erb文件

<% @purchases.each do |purchase| %> #this works 
    <tr> 
    <td><%= purchase.user_purchase_type.typename %></td> #this fails 
    <td><%= purchase.date %></td> 
    <td><%= purchase.note %></td> 
    </tr><p> 
<% end %> 

购买控制器

def index 
    @user_purchase_types = current_user.user_purchase_types   # this works 
    @purchases = current_user.purchases    #this works 
+0

可以显示USER_TYPE,购买和用户模型 – Naveed

+0

你拼错购买视图“purhcase.user_type.typename”,但我想这不是你的问题吧? – Henrik

+0

类用户:破坏 的has_many:user_purchase_types,:依赖=>:摧毁 私人 endclass用户类型<的ActiveRecord :: Base的 belongs_to的:用户 attr_accessible:类型名称,:ID 结束 – sopwithpup

回答

1

你只需要在你现有的关联中添加外键。

class Purchase < ActiveRecord::Base 
    belongs_to :user 
    has_many :user_purchase_types, :foreign_key => 'user_purchase_type_id' 
    attr_accessible :date, :user_purchase_type_id, :note 
end 
+0

这个加上belongs_to:user_purchase_type做到了,谢谢 – sopwithpup

1

有它们之间的一对一的关系RGT? 是的,您应该可以访问typename,但是可以使用@ purchase.user_type.typename。而不是purchase.user_type.typename。

并且如果您也可以显示用户模型会更好。

并且是current_user定义的吗?

您也可以先查找usertype,然后访问它: @user_type = UserType.find(@ purchase.user_type_id) @user_type。TYPENAME

你应该总是先在控制台上的关系,看看你得到它RGT


你的关系都搞砸了。 您在购买和用户购买类型之间有一对多的关系。 因此 你必须使用你不能使用@ purchase.user_purchase_type.typename

@purchase.user_purchase_types.each do |i| 
i.typename 
end 
+0

这不是可悲的 – sopwithpup

1
class Purchase < ActiveRecord::Base 
    belongs_to :user 
    has_many :user_purchase_types 
    attr_accessible :date, :user_purchase_type_id, :note 
end 

Purchase - >UserPurchaseType协会是一个has_many关系,但你似乎在试图用​​使用这些功能将表明belongs_to :user_purchase_type关系,但你的公会是has_many :user_purchase_types

这听起来像你可能想是这样的:

<% @purchases.each do |purchase| %> #this works 
    <tr> 
    <td><%= purchase.user_purchase_types.collect(&:typename).join(',') %></td> 
    <td><%= purchase.date %></td> 
    <td><%= purchase.note %></td> 
    </tr><p> 
<% end %> 

要列出所有的UserPurchaseTypetypename的逗号分隔。

如果你这样做,确保当你在控制器中加载你的@purchases时还包括一个.includes(:user_purchase_types)。这将迫切加载关联,并避免在迭代时加载每个UserPurchaseType

+0

帮忙谢谢,已经澄清了我的想法下面的解决方案 – sopwithpup