Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 确定相关型号的计数是否>;0_Ruby On Rails_Model - Fatal编程技术网

Ruby on rails 确定相关型号的计数是否>;0

Ruby on rails 确定相关型号的计数是否>;0,ruby-on-rails,model,Ruby On Rails,Model,我有一个模型叫Stem。我需要一个“竖起大拇指”功能,因此我创建了第二个模型,名为Thumb,它由stem\u id和user\u id组成 我还使用restful身份验证插件获取用户凭据 我有一个“竖起大拇指”按钮,它可以在thumbs表中添加一行,但我希望能够检查当前登录的用户是否已经竖起了这个特定的stem 我尝试将此添加到Stem模型: def thumbed Thumb.count_by_sql ["SELECT COUNT(*) FROM thumbs WHERE user_

我有一个模型叫
Stem
。我需要一个“竖起大拇指”功能,因此我创建了第二个模型,名为
Thumb
,它由
stem\u id
user\u id
组成

我还使用restful身份验证插件获取用户凭据

我有一个“竖起大拇指”按钮,它可以在
thumbs
表中添加一行,但我希望能够检查当前登录的用户是否已经竖起了这个特定的stem

我尝试将此添加到
Stem
模型:

def thumbed
    Thumb.count_by_sql ["SELECT COUNT(*) FROM thumbs WHERE user_id = ? AND stem_id = ?", current_user.id, self.id ]
end
这里的问题是
stem
模型无法访问控制器拥有的
当前用户
变量

有没有一种方法可以让我访问此属性,或者,有没有另一种方法可以让我检查此属性?我希望将其作为模型中的一个属性,因为茎被传递给使用RubyAMF的Flex应用程序


谢谢

您可以将当前用户传递给
拇指
?你从哪里打过来的

顺便说一句,您可以尝试使用关联来简化所有这些。我不是100%确定我理解你在做什么,但听起来你有以下几点

class Stem
  has_many :thumbs
end

class User
  has_many :thumbs
end

class Thumb
  belongs_to :user
  belongs_to :stem
end

然后,您可以使用find-Through关联来获取数据,而无需使用直接SQL。查看此RailsCast:

您的控制器知道当前用户,而您的
Stem
型号可能不应该知道。但是,您可以清理代码,避免使用名为_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)

首先对我起作用的是:

我在stem模型中添加了以下方法:

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
然后,在我的show action中,我添加了以下几行:

@stem.thumbed = @stem.thumbed_by? current_user.id
@stem.owned = @stem.owned_by? current_user.id

这正是我想要的工作方式(Flex应用程序已经正确地解释了这一点),但是有没有一种方法可以缩短它?

是的,我确实有一些类似于设置的关联,我可以从sql更改为其他类型,如果我有当前用户的id,我不能在thumbed上使用任何参数,因为我希望我的Flex应用程序在通过Rubyamfhmm传递数据时将其作为属性读取。我想我帮不了什么忙,因为我从来没有用过RubyAMF。也许您可以从flex应用程序中调用thumbs\u控制器中的一个操作,从而检查用户id?我认为这里的基本问题是,当模型层可能属于控制器时,您试图在模型层中执行某些操作。从我所看到的,RubyAMF被设计成插入控制器层。是的,我想我只需要在这个过程中添加几个步骤,并将其放入控制器中