我创建了一个用户可以投票投票的应用。我从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
。* FROMvote_options
INNER JOINvotes
vote_options
。id
=votes
。vote_option_id
WHEREvotes
。user_id
= 4 ANDvote_options
。delegated
= 0
所以我试过了:
def voted_for?(poll)
vote_options.votes.where(:delegated => 0).any? {|v| v.poll == poll}
end
返回:
未定义的方法`投票' for VoteOption :: ActiveRecord_Associations_CollectionProxy:0x007f002ad28be8>
我不明白,因为我已经建立了协会。
我做错了什么?我该如何解决?
答案 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