我正在尝试理解如何在创建时将一个模型记录的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
添加到用户模型吗?
答案 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)