profile belongs_to user但无法访问控制器中的用户

时间:2013-11-08 19:09:20

标签: ruby-on-rails tags ruby-on-rails-4 rails-activerecord acts-as-taggable-on

我已经做了一百万次,但我似乎无法弄清楚为什么它现在不起作用。我有一个has_one个人资料的用户模型。配置文件属于用户模型。在我的配置文件控制器中,我试图访问属于用户子集的所有配置文件,但我似乎无法访问。我试过这个:

def index
    if params[:tag]
        @profiles = Profile.user.tagged_with(params[:tag])
    else
        @profiles = Profile.all
    end
end

我收到方法用户未定义的错误。然而,在视图中,我已经调用@ profiles.user并且它工作正常。我也尝试过:

def index
    if params[:tag]
        @profiles = Profile.users.tagged_with(params[:tag])
    else
        @profiles = Profile.all
    end
end

但这不起作用。请帮忙。感谢。

编辑:

class User < ActiveRecord::Base
    has_one :profile
    acts_as_taggable
end


class Profile < ActiveRecord::Base
    belongs_to :user
end

2 个答案:

答案 0 :(得分:1)

这是因为user不是Profile的类方法,它是一个实例方法。并且

你需要:

def index
 if params[:tag]
   @profiles = Profile.find(params[:profile_id]).user#whatever else you're trying to do
 else
   @profiles = Profile.all
end

但根据您在后续文章中所说的内容,您需要从配置文件的联接中选择用户,然后调用tagged_with

也许

def self.users_with_profiles
 query = <<-SQL
    SELECT u.*
      FROM users AS u
      JOIN profiles AS p
        ON p.user_id = u.id
  SQL

  find_by_sql(query)
end

然后

def index
  @profiles = User.users_with_profile.tagged_with(params[:tag]).map {|user| user.profile }
end

或者它可能更简单

def index
  @profiles = User.joins(:profile).tagged_with(:params).map { |user| user.profile }
end

这将返回Profile s,这是我假设你正在寻找的,因为它是在Profile模型上调用的。

如果这不能让你一直到那里,我希望它至少能让你更接近

答案 1 :(得分:0)

按照以下步骤尝试:

   def index
      if params[:tag]
        # first find out users having tag = params[:tag]
        users = User.tagged_with(params[:tag])
        # collect ids of those users assume user_ids = array of ids
        user_ids = users.map(&:id)
        # then make query on profile model
        @profiles = Profile.where(user_id: user_ids) # get list of profiles            
      else
        @profiles = Profile.all
      end
   end