我正在努力理解在创建一个模型记录时,如何将其ID存储在一个单独的活动记录表(在本例中为用户表)中。
基本上,我有两个模型。CCD_ 1的用户和CCD_。在我的应用程序中,用户只能有一个税务记录,目前我通过将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存储在用户表中。我想这是一种双向关系,但我不明白在我的has_many :taxes
0函数中,我是如何与用户模型交互的。我想这会在after_save
回调中完成吗?
在这种情况下,我是否还需要将belongs_to: tax
添加到用户模型中?
我会有点不同。
在一对一关系中,您不需要belongs_to
定义,而是需要has_one
在我看来,概念上正确的方法是:
user.rb:
has_one :tax
那么,你的方法就是
@user=User.find(..)
@user.build_tax(income: income, taxes: taxes, rrsp: rrsp)
基本上,我有两个模型。具有_many:tax和属于_to:user的税务模型的用户。在我的应用程序中,用户只能有一个税务记录
如果一个用户只能有一个税务记录,则不应使用has_many :taxes
,而应改用has_one :tax
。Rails将自动处理一切。
请参阅http://guides.rubyonrails.org/association_basics.html#the-有一个关联
然后你就不需要"过滤之前看看用户是否已经有了"。然而,你想确保用户在任何时候都有税务记录吗?你可以validates_presence_of :tax
请参阅http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html#method-i验证
如果使用嵌套形式,则可能根本不需要TaxesController
。
此外,如果您使用嵌套形式,您将使用accepts_nested_attributes
,因此不再需要您的belongs_to: user
0方法
请参阅http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html