按has_many关联中的属性值范围过滤ActiveRecord

时间:2013-03-26 21:10:35

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

假设我有一个有很多玩具的人。然后我有一个有很多颜色的玩具。我在Person#show方法中尝试做的是过滤包含各种颜色的玩具。

class Person < ActiveRecord::Base
 attr_accessible :name
 has_many :toys
end

class Toy < ActiveRecord::Base
 attr_accessible :size
 belongs_to :person
 has_many :colors
end

class Color < ActiveRecord::Base
 attr_accessible :color
 belongs_to :toy
end

然后在我的PersonController中,我希望过滤玩具是一系列颜色。

class PersonController < ApplicationController
 def show
  @person = Person.find(params[:id])
  # Now I want to filter by toy colors that might be red or blue or purple or etc...
  # So when in my view I do @person.toys I know they only contain the filtered colors
  @person.toys.categories
 end
end

非常感谢帮助或建议。仍在积极学习Rails。

1 个答案:

答案 0 :(得分:1)

如果您想采用数据库方法,您可以执行以下操作:

if params[:toy_colors].nil? 
  @toys = @person.toys
else
  colors = params[:toy_colors].split(',')
  # NOTE. You should obviously check that the colors array 
  # contains only expected colors to avoid any sql injection.
  @person.toys.joins(:colors).where('colors in ?', colors)
end

其中颜色作为参数传递,例如。

http://localhost:3000/person/1?toy_colors=red,green