2013-05-14 49 views
0

我是代码中的新手,我试图设置两个连接的模型:用户模型和产品模型。 产品型号有两个用户,一个是业主,另一个是借款人。 用户模型有许多产品,作为所有者和借款人。如何构建我的模型以连接所有者,借款人和产品?

你知道下面的代码是否满足我的目的?

class User 
    has_many :products 
end 

class Product 
    belongs_to :owner, class_name: "User", foreign_key: "user_id" 
    has_one :borrower, class_name: "User", foreign_key: "user_id" 
end 

回答

2

其实,你需要在你的产品型号“指点”,以您的用户模型中的两个不同的列:

owner_id, borrower_id 

您的用户模型应该是这样的:

class User 
    has_many :owned_products, class_name: "Product", foreign_key: "owner_id" 
    has_many :borrowed_products, class_name: "Product", foreign_key: "borrower_id" 
end 

和你的产品型号是这样的:

class Product 
    belongs_to :owner, class_name: "User", foreign_key: "owner_id" 
    belongs_to :borrower, class_name: "User", foreign_key: "borrower_id" 
end 
+0

感谢您的回答!你能告诉我如何在这种情况下将owner_id和borrower_id连接到我的user_id吗?我必须在他们之间建立关系模型吗? – 2013-05-14 08:07:45

+0

不,您不需要关系模型,您必须使用迁移将两列添加到您的产品模型中,并删除user_id之一,因为您不再需要它了。您将通过owner_id和借款人通过borrower_id获得所有者。 – 2013-05-14 08:26:58

+0

你的答案和@Galen的答案之间的技术差异在哪里? – 2013-05-14 08:33:46

1

您可以使用STI方法(单继承表):

模型用户:

class User < ActiveRecord::Base 
    # general attributes and validations and the like 
end 

所有者型号:

class Owner < User 
    # specific attributes and/or validations if any 
    has_many :products 
end 

借款人模式:

class Borrower < User 
    # specific attributes and/or validations if any 
    haas_many :products 
end 

产品型号:

class Product < ActiveRecord::Base 
    # attributes, validation and the like 
    belongs_to :owner 
    belongs_to :borrower 
end 

基本上,组织所有者和借款人作为用户类型,继承其属性。

one_owner.products会告诉你通过one_owner

one_borrower.products拥有的产品将显示由one_borrower

one_product.owner将显示该产品的拥有者借用产品

one_product.borrower会告诉你为借款人该产品

您可以在此主题中看到一个广泛的示例:Rails Question: belongs_to with STI -- how do i do this correctly?

+0

感谢您的回答!关于此问题的另一个问题是:用户可以成为借款人和所有者吗?还是独家? – 2013-05-14 08:06:14

+0

我创建了两个用户,它使一些有趣的事情。当我做'User.all'或'Borrower.all'或'Owner.all'时,结果是一样的。 – 2013-05-14 08:21:51

+0

@FloRahl,如果你使用'my_borrower = Borrower.new'等和'my_owner = Owner.new',你将有2个User.count,每个借款人和所有者数(或.all)有1个。 – Galen 2013-05-14 08:46:11

相关问题