has_many IF条件

时间:2013-01-05 20:05:34

标签: ruby-on-rails ruby ruby-on-rails-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。

3 个答案:

答案 0 :(得分:3)

Rails的方法是STI:

 class Advertisement < ActiveRecord::Base
 end

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

只有LadyAd对象能够有女士。

答案 1 :(得分: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

答案 2 :(得分:0)

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

假设您正在进行自我引用加入,那么您需要一个club_id列:

class Advertisement < ActiveRecord::Base
   has_many :ladies, -> {where(type: 'club')}, class_name: "Advertisment"
 end