如何使用不同的where条件获得has_many关系

时间:2014-04-30 20:04:26

标签: ruby-on-rails activerecord

我有Headers和Items的以下类,并希望得到所有只有is_deleted = false的项目并忽略is_enabled(或者得到true / false,因为is_enabled是布尔值):

class Header < ActiveRecord::Base
  has_many :items, :conditions => 'items.is_deleted=false and items.is_enabled=true', :order => 'position'
  ...
end

class Item < ActiveRecord::Base
  belongs_to :header
  ....
 end

h290=Header.find(290)
h290.items # 2 item
h290.items.where('is_enabled=false')  # and's them to (items.is_deleted=false and items.is_enabled=true) AND (is_enabled=false) ORDER BY position

有没有办法说无视is_enabled = true或使其成为上面的地方或者是这样: (items.is_deleted=false and items.is_enabled=true) OR (items.is_deleted=false and items.is_enabled=false) ORDER BY position

也许是一个不同的has_many喜欢:

  has_many :all_items, :conditions => 'items.is_deleted=false', :order => 'position', :class_name=>'item'

但这似乎不起作用 - 可能只是语法问题。

获取项目启用状态的最佳方法是什么?我可以过滤我的项目,因为is_enabled是真还是假?也许只是这样的方法,但似乎最好将此作为关系的一部分:

class Header < ActiveRecord::Base
...
def all_items
  Item.where('header_id=? and is_deleted=false',self.id)
end

thx任何帮助

1 个答案:

答案 0 :(得分:1)

一个选项可以是使用范围:

class Header < ActiveRecord::Base
  scope :deleted, joins(:items) & Item.deleted
  scope :enabled, joins(:items) & Item.enabled    
  ## Other way to write the same thing:
  #scope :enabled, joins(:items).merge(Item.enabled)
end

class Item < ActiveRecord::Base
  scope :deleted, lambda { where("is_deleted=false") }
  scope :enabled, lambda { where("is_enabled=true ") }
end

您可以使用这些范围使用合适的过滤器获得所需的结果。

或其他方法可以在Header中编写过滤函数,并将其与关联使用:

class Header < ActiveRecord::Base
  has_many :items, :order => 'position'

...
def deleted
  where('items.is_deleted=false')
end

有了这个,您可以通过以下方式获得结果:@header.deleted.items

看看Advanced Queries in Rails 3,你可能会得到更合适的想法。