我有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任何帮助
答案 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,你可能会得到更合适的想法。