Has_one和has_many的关系

时间:2013-11-07 09:52:53

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord

我有两个表registrationsdiscounts,分别保存有关注册和折扣的信息。每次注册都可以有一个折扣,每个折扣可以有很多注册。

当我执行Discount.find(1).registrations之类的操作时,我可以提取所有注册以获得折扣,但当我尝试拨打Registration.find(1).discount时,我会收到错误

Unknown column 'discounts.registration_id' in 'where clause': SELECT  `discounts`.* FROM `discounts`  WHERE `discounts`.`registration_id` = 1  ORDER BY `discounts`.`id` ASC LIMIT 1`

我的模型目前设置如下:

class Registration < ActiveRecord::Base
        has_one :payment
        has_one :discount
end

class Discount < ActiveRecord::Base
        has_many :registrations
end

此外,我的registration表有一个外键discount_id

如果我在belongs_to模型中设置registrations关系,但注册不属于折扣,我可以使关联工作 - 他们可能有也可能没有。

我该如何建立这种关系?我应该设置另一个表并使用has_many, through关系吗?

编辑:我不想在belongs_to模型中使用registration关系,因为注册不属于折扣。

2 个答案:

答案 0 :(得分:2)

如果折扣可以有很多注册,那么您想使用belongs_to而不是has_one

class Registration < ActiveRecord::Base
    has_one :payment
    belongs_to :discount
end

class Discount < ActiveRecord::Base
   has_many :registrations
end

查看belongs_to和has_one

之间差异的explanation

答案 1 :(得分:0)

你应该像这样定义你的关系:

class Registration < ActiveRecord::Base
  has_one :payment
  has_one :discountable
  has_one :discount, through: :discountable
end

class Discount < ActiveRecord::Base
  has_many :registration, through: :discountables
end

class Discountable < ActiveRecord::Base
  belongs_to :registration
  belongs_to :discount
end 

由于