我有一个名为Stem
的模型。我需要一个“竖起大拇指”功能,因此我创建了第二个名为Thumb
的模型,该模型由stem_id
和user_id
组成。
我也在使用restful身份验证插件来获取用户凭据。
我正在使用'竖起'按钮,它可以在thumbs
表中添加一行,但是我希望能够检查当前登录的用户是否已经竖起大拇指这个特殊的词干。
我尝试将其添加到Stem
模型中:
def thumbed
Thumb.count_by_sql ["SELECT COUNT(*) FROM thumbs WHERE user_id = ? AND stem_id = ?", current_user.id, self.id ]
end
这里的问题是stem
模型无法访问控制器所拥有的current_user
变量。
有没有办法可以访问这个属性,或者,还有另一种方法可以检查这个吗?我希望将此作为模型中的属性,因为使用RubyAMF将词干传递给Flex应用程序。
谢谢!
答案 0 :(得分:1)
您的控制器知道current_user,您的Stem
模型可能不应该。但是,您可以清理代码并避免使用named_scope
硬连接SQL并将用户传递给它。
#thumb.rb
named_scope :for_user_id, lambda {|id| {:conditions => {:user_id => id}}}
#stem.rb
def thumbed_by_user(user)
self.thumbs.for_user_id(user.id).count > 0
end
# some controller
stem = some_method_that_gets_a_stem
is_already_thumbed = stem.thumbed_by_user(current_user)
答案 1 :(得分:0)
您可以将当前用户传递给thumbed
吗?你在哪里叫它?
class Stem
has_many :thumbs
end
class User
has_many :thumbs
end
class Thumb
belongs_to :user
belongs_to :stem
end
然后你可以使用find虽然关联来获取你的拇指而不诉诸直接SQL。看看这个RailsCast:http://railscasts.com/episodes/3-find-through-association
答案 2 :(得分:0)
最终为我工作的是这样的事情:
我将这些方法添加到我的干模型中:
def thumbed_by? usr_id
Thumb.count(:conditions => {:user_id => usr_id, :stem_id => self.id}) > 0
end
def owned_by? usr_id
self.id == usr_id
end
我还补充说:
attr_accessor :thumbed, owned
然后在我需要这些动作的节目中,我添加了以下几行:
@stem.thumbed = @stem.thumbed_by? current_user.id
@stem.owned = @stem.owned_by? current_user.id
这正是我想要的(Flex应用程序已经正确地解释了它),但有没有办法可以缩短它?