mykingla/vote — Issue #3: 为了方便查询，模型以及表关联的建议调整
Author: ben7th
Created: 2012-03-05 01:22:19+00:00
State: open

首先新增一个类 VoteResult，migration已经写好，主要的声明如下：

```ruby
class VoteResult < ActiveRecord::Base
belongs_to :user
belongs_to :vote

validates :user, :vote, :presence => true
end
```

这个模型含有两个外键，关联到 user 和 vote 这两个对象。也就是说，当一个 user 参与一个 vote 时，就创建一条 vote_results 表的记录。

然后，再声明这个模型和 VoteResultItem 的关系：

```ruby
# 声明一对多关联
class VoteResult < ActiveRecord::Base
# ...
has_many :vote_result_items
# ...
end
```

```ruby
# 由于 VoteResult 上已经记录了 vote 和 user 信息，所以 VoteResultItem 上面可以不记了
class VoteResultItem < ActiveRecord::Base

# belongs_to :user 这样，这个声明以及相关字段就可以去掉了
belongs_to :vote_item
# belongs_to :vote 这样，这个声明以及相关字段就可以去掉了
belongs_to :vote_result

validates :vote_result, :vote_item, :presence => true
end

# 总的来说：
# vote_result_items 表上 user_id, vote_id, select_limit 三个字段是可以去掉的
# 另外还需要增加 一个 vote_result_id
```

总的来说：
vote_result_items 表上 user_id, vote_id, select_limit 三个字段是可以去掉的
另外还需要增加 一个 vote_result_id
然后再在 VoteResult 里作声明：

然后：

```ruby
# 添加 nested_attributes 声明，以便于使用 nested_form 来保存数据
class VoteResult < ActiveRecord::Base
# ...
accepts_nested_attributes_for :vote_result_items
# ...
end
```

这样，在controller里面的创建就可以简化为
```ruby
vote_result = VoteResult.new(params[:vote_result])
vote_result.user = current_user
if vote_result.save
# ...
```

由于使用了 nested_form ，参数就可以很简化。
创建时校验投票选项数是否超过了限制选择数目的逻辑就可以移动到模型层去做。

许多查询方法也可以得到简化。