I have a model X which has_many models Y. Y has a field called 'type', which can be A, B, or C. I know that on the show view for X, I can use:
<%= @x.ys.count %>
to return the number of Y objects associated with an instance of X. Or, I can use:
<%= Y.group(:type).count["A"] %>
To return the TOTAL number of Y objects of type A, across all X objects.
What if I want to only return the number of Y objects of type A associated with a particular instance of X, such that @x is the particular instance whose show view is being accessed?
EDIT:
The ys method is defined within x.rb as such:
Class X < ActiveRecord::Base
has_many :fs
has_many :gs
has_many :f_ys, through: :fs, source: :ys
has_many :g_ys, through: :gs, source: :ys
def ys
f_ys + g_ys
end
end
Could the fact that this is a 'through' relationship be interfering with my ability to access some methods like 'where'?
答案 0 :(得分:1)
It should be as simple as:
<%= @x.ys.where(type: 'A').size %>
If the ys
method returns an array instead than an association, you can tweak it like this:
<%= @x.ys.select{|y| y.type == 'A'}.size %>
You can change your code to this to make it faster:
def ys(type = nil)
if type
f_ys.where(type: type) + g_ys.where(type: type)
else
f_ys + g_ys
end
end
in order to place the filtering function in the queries instead of select
ing the array.
Then:
<%= @x.ys.count %>
<%= @x.ys('A').count %>