Rails模型方法与关联

时间:2018-04-03 07:17:18

标签: ruby-on-rails

我创建了一个用户可以投票投票的应用。我从this tutorial开始,然后将其修改为我的需要。

poll.rb:

has_many :vote_options, dependent: :destroy
has_many :votes, :through => :vote_options

vote_option.rb:

belongs_to :poll
has_many :votes, dependent: :destroy

vote.rb:

belongs_to :vote_option
belongs_to :user

user.rb

has_many :votes, dependent: :destroy
has_many :vote_options, through: :votes

用户只能投票一次。要检查用户是否已通过user.rb投票:

def voted_for?(poll)
  vote_options.any? {|v| v.poll == poll}
end

我在delegated表中添加了一列votes。现在想要将方法voted_for仅限于委托为false的投票。

所以我试过了:

def voted_for?(poll)
  vote_options.where(:delegated => 0).any? {|v| v.poll == poll}
end

返回:

  

Mysql2 ::错误:未知栏' vote_options.delegated'在'哪里   子句':SELECT vote_options。* FROM vote_options INNER JOIN   votes vote_optionsid = votesvote_option_id WHERE   votesuser_id = 4 AND vote_optionsdelegated = 0

所以我试过了:

def voted_for?(poll)
  vote_options.votes.where(:delegated => 0).any? {|v| v.poll == poll}
end

返回:

  

未定义的方法`投票' for VoteOption :: ActiveRecord_Associations_CollectionProxy:0x007f002ad28be8>

我不明白,因为我已经建立了协会。

我做错了什么?我该如何解决?

2 个答案:

答案 0 :(得分:1)

如果您完全关注帖子中提到的this tutorial,那么它将是

def voted_for?(poll)
    votes.any? {|v| v.vote_option.poll == poll}
end

请参阅此existing repo

答案 1 :(得分:1)

你误解了关联

目前您正在呼叫vote_options.votes,这实际上是错误的。

作为vote_options返回记录集合,并且您无法调用.votes进行收集它将与单个记录一起使用,因为关联是vote_option有很多票,这意味着一对多不多很多人。

根据您的情况,您可以尝试

def voted_for?(poll)
  votes.where(:delegated => 0).any? {|v| v.poll == poll}
end 

如果您仍然有任何疑惑,请通过this