确定相关模型的数量是否> 0

时间:2010-05-24 01:16:20

标签: ruby-on-rails model

我有一个名为Stem的模型。我需要一个“竖起大拇指”功能,因此我创建了第二个名为Thumb的模型,该模型由stem_iduser_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应用程序。

谢谢!

3 个答案:

答案 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应用程序已经正确地解释了它),但有没有办法可以缩短它?