有许多通过条件协会

时间:2011-10-04 03:50:49

标签: ruby-on-rails ruby ruby-on-rails-3

我正在尝试通过关联添加一个条件而没有运气。这是我视频模型中的关联:

has_many :voted_users, :through => :video_votes, :source => :user

我想仅获取其视频投票的voted_users等于1的value视频。我该怎么做?

6 个答案:

答案 0 :(得分:1)

我建议在视频模型类中创建一个模型方法 类似的东西:

def users_with_one_vote
  self.voted_users, :conditions => ['value = ?', 1]
end

然后在控制器中使用video.users_with_one_vote

然后测试也更容易。

您有可能从“值”更改该列名称。可能会提出一些问题(保留?)。

答案 1 :(得分:1)

我分两个阶段完成:

首先,我在没有任何条件的情况下定义模型之间的has_many :through关系。

其次,我添加了一个定义where条件的'scope'。

具体来说,我会做类似的事情:

class User < ActiveRecord::Base
  has_many :video_votes
  has_many :votes, :through=>:video_votes
  def self.voted_users
    self.video_votes.voted
  end
end

class VideoVote
  def self.voted
    where("value = ?", 1)
  end
end

class Video
  has_many :video_votes
  has_many :users, :through=>:video_votes
end

然后你可以得到投票使用的用户:

VideoVote.voted.collect(&:user).uniq

我相信会返回所有投票的用户数组。这不是您使用的确切代码 - 它们只是片段 - 但这个想法是一样的。

答案 2 :(得分:0)

has_many :voted_users, :through => :video_votes, :source => :user, :conditions => ['users.votes = ?', 1]

诀窍?

答案 3 :(得分:0)

我发现在我的模型中定义此方法有效:

def upvoted_users
  self.voted_users.where("value = 1")
end

然后调用@video.upvoted_users就可以了。

答案 4 :(得分:0)

在不弄乱关系的情况下执行此操作的最佳方法是制作更复杂的查询。对于这个特定问题,关系不是最好的选择。请理解,关系更像是一种“数据定义方式”,然后是“商业规则定义”的一种方式。

必须在更具体的层上定义业务逻辑或业务规则。

我对您的问题的建议是创建一种方法来搜索仅在您的视频上投票一次的用户。类似的东西:

class Video < ActiveRecord::Base

  def voted_once()
    User.joins(:video_votes).where("video_votes.value == 1 AND video_votes.video_id == ?", this.id)
  end
对于许多事情来说,Rails是神奇的,但复杂的查询仍然需要以“SQL”的思维方式完成。不要让虚幻的面向对象隐喻让你失明

答案 5 :(得分:0)

只要我们抛出各种想法,如何使用关联扩展。

class VideoVote
  scope :upvotes, where(:value => 1)
end

class Video
  has_many :voted_users, :through => :video_votes, :source => :user do
    def upvoted
      scoped & VideoVote.upvotes
    end
  end
end

然后你对完全没有参数进行调用感觉很好而且你在技术上没有为你的视频模型添加另一种方法(它在关联上,对吗?)

@video.voted_users.upvoted