模型2方式关系在用户表中存储id

时间:2014-02-07 20:53:06

标签: ruby-on-rails model-view-controller associations

我正在尝试理解如何在创建时将一个模型记录的ID存储在单独的活动记录表(在本例中为用户表)中。

基本上,我有两个型号。 has_many :taxes的用户和belongs_to: user的税务模型。在我的应用程序中,用户只能有一个税务记录,目前我通过将user.id存储在税收模型的列中来实现,并检查过滤器以查看用户是否已经创建了税务记录(检查他们的user.id是否在表中。)

create_table "taxes", force: true do |t|
    t.integer  "user_id"
    t.integer  "income"
    t.integer  "taxes"
    .....

请注意,目前这一切都在index行动中,这种做法毫无意义,因为用户只能拥有一个税务记录,并且只能查看自己的税务记录。应该使用我假设的show操作来完成。

现在问题是,当用户创建单一税务记录时,税收模型设置如下,所有这些都与税收活动记录表进行交互:

def store_raw_taxes
    tax = Tax.new(user_id: user.id, income: income, taxes: taxes, rrsp: rrsp)
    tax.save
end

为了使用show(并检查用户是否已经创建了税务记录),我想将tax_id存储在其行中的实际用户表中。我创建了一个迁移AddTaxIdToUsers,它创建了一个引用,并在users表中添加了一个名为tax_id的列。

我不知道如何将创建的税务记录的ID存储在用户表中。这是一种双向关系我猜,但我不明白在我的store_raw_taxes函数中,我还会如何与User模型进行交互。我想这可以在after_save回调中完成吗?

在这种情况下,我还需要将belongs_to: tax添加到用户模型吗?

2 个答案:

答案 0 :(得分:0)

  

基本上,我有两个型号。 has_many:税收的用户和belongs_to:user的税收模型。在我的应用程序中,用户只能有一个税务记录

如果用户只能拥有一个税务记录,则不应使用has_many :taxes,而应使用has_one :tax。 Rails会自动处理所有事情。

请参阅http://guides.rubyonrails.org/association_basics.html#the-has-one-association

然后你不需要“在过滤之前看看用户是否已经”。但是,您是否希望确保用户始终拥有税务记录validates_presence_of :tax

请参阅http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i-validates

如果您使用嵌套表单,则可能根本不需要TaxesController

此外,如果您使用嵌套表单,则会使用accepts_nested_attributes,因此不再需要store_raw_taxes方法

请参阅http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

答案 1 :(得分:0)

我会有所不同。

以一对一的关系,您不需要belongs_to定义,但has_one

在我看来,概念上正确的做法是:

user.rb:

has_one :tax

然后,你的方法将是

@user=User.find(..)
@user.build_tax(income: income, taxes: taxes, rrsp: rrsp)