我已经做了一百万次,但我似乎无法弄清楚为什么它现在不起作用。我有一个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
答案 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