2014-09-03 45 views
0

我有一个表像这样的“捆绑”Rails的加入 - 在同年龄组选择用户

Bundle.joins("inner join users on users.id=bundles.user_id").where("users.first_name = ?", first_name).where("users.last_name = ?", last_name).where("users.age_group = ?", age_group) 

所以,在这里,我们正在根据匹配用户的所有包(由表中的非列比较) 。

这里,firstname,lastname是'users'表上的列。
但age_group不是列,它是从dob(column)计算的模型方法。

如何做到这一点?

AGEGROUPS = { 'teen' => 13..18, 'aboveteen' => 19..30, 'above30' => 31..40 } 

def age_group #a model method of user.rb 
    age = get_age(self.birthdate) 
    User::AGEGROUPS.each do |g| 
     if age.between?(g[1].first, g[1].last) 
      return g[0] 
     end 
    end 
end 
def get_age 
    return unless birthdate 
    now = Time.now.utc.to_date 
    now.year - birthdate.year - (birthdate.to_date.change(:year => now.year) > now ? 1 : 0) 
end 

让我知道更多的信息。

+0

那么你如何计算你的'age_group'?你将不得不用SQL语句重写它。 – 2014-09-03 09:37:55

+0

@MarekLipka你可以请你这样做。我不知道该怎么做。我会用年龄组模型方法更新问题。 – user2349115 2014-09-03 09:38:42

回答

1

这种尝试它的语句之间:

Bundle.joins("inner join users on users.id=bundles.user_id").where(
     "users.first_name = ?", first_name).where("users.last_name = ?", last_name) 
     .where("users.birthday BETWEEN ? AND ?", begin_birthday(age_group), end_birthday(age_group) 

和两个附加的方法来计算第一和相应年龄组的最后一年。 这样begin_year('teen')= 13等等。

def end_birthday(age_group) 
    years = AGEGROUPS[agegroup].first 
    now = Time.now.utc.to_date 
    Date.new(now.year - years, now.month, now.day) 
    end 

    def begin_birthday(age_group) 
    years = AGEGROUPS[agegroup].last 
    now = Time.now.utc.to_date 
    Date.new(now.year - years, now.month, now.day) 
    end 
+0

谢谢,但在这里,年龄是计算值。生日是领域。你能否更新答案? – user2349115 2014-09-03 09:58:46

+0

你如何计算get_age(生日)?我们需要以某种方式扭转这个功能。 – irene 2014-09-03 10:06:31

+0

使用get_age函数更新的问题。 – user2349115 2014-09-03 10:08:43