3

我有可以有女士的广告,但前提是类型是“俱乐部”。

有没有一种方法可以做到这一点?特别是不创建女士对象?如果她的父母是 type=club,我是否必须在创建之前检查一个女士对象?

class Advertisement < ActiveRecord::Base

  validates_inclusion_of :type, in: %w(club lady)

  has_many :ladies, :dependent=>:destroy

  #only have ladies if the club =
  def ladies 
    return nil unless type == "club"
    super    
  end

end

我正在使用 Rails 3.2。

4

3 回答 3

3

Rails 做到这一点的方法是 STI:

 class Advertisement < ActiveRecord::Base
 end

 class LadyAd < Advertisement
   has_many :ladies, :dependent=>:destroy
 end

并且只有 LadyAd 对象能够拥有女士。

于 2013-01-05T20:36:58.107 回答
0

似乎所有这一切都是将组合(has_many)与继承(女士<广告)混合在一起,这没有多大意义(技术上和概念上)。如果是这种情况并且您没有使用 Lady 和 Club 对象,您至少应该将类型重命名为 ad_type...

假设您要进行自我参照加入,那么您将需要一个 club_id 列:

class Advertisement < ActiveRecord::Base
   has_many :ladies, -> {where(type: 'club')}, class_name: "Advertisment"
 end
于 2013-01-11T12:13:39.473 回答
0

也许使用活动记录关联扩展:(使用 proxy_association.owner)

http://guides.rubyonrails.org/association_basics.html#association-extensions

module LadiesAtClub
  def at_club
    # you may need to iterate over an array or something here...
    proxy_association.owner.type == 'club'
  end
end

class Advertisement < ActiveRecord::Base
  has_many :ladies :extend => LadiesAtClub
end
于 2013-01-11T01:18:57.043 回答