如何设置此关系并显示正确的数据

时间:2014-05-20 02:21:51

标签: ruby-on-rails database activerecord ruby-on-rails-4 models

不确定如何正确设置此关系。 3个表:用户,帖子,状态

模特 -

User Model
has_many :posts

Post Model
belongs_to :user
has_one :status

Status Model
#Not sure about this.

表 -

Users: name, email, password_digest
Posts: user_id, status_id, post_title, post_content
Statuses:  user_id, status_title, status_active

用户可以创建自己的状态,因此我不确定状态是属于用户还是帖子。

在用户控制器中,对于新操作,我有以下内容以帮助在制作新帖子时在下拉列表中生成状态选项:

def new

@post = Post.new
@options_statuses = Status.where(:admin_user_id => session[:id])

end

创建新帖子的代码(来自部分内容):

<%= f.label(:status_id, "Status") %><br/>
<%= f.select(:status_id, @options_statuses.map { |s| [ s.status_title, s.id ] }) %><br/><br/>

<%= f.label(:post_title, "Title") %><br/>
<%= f.text_field(:post_title) %><br/><br/>

<%= f.label(:post_content, "Content") %><br/>
<%= f.text_area(:post_content) %><br/><br/>

帖子信息正确保存到数据库中。问题是当我想通过索引或显示操作显示帖子时。目前我有以下内容:

<% @posts.each do |post| %>

<%= post.status_id %> - <%= post.created_at %><br/>  
<%= post.post_title %> - <%= post.post_content %>

<% end %>

我不想显示status_id,而是希望显示status_title但不知道如何执行此操作。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

首先,由于您的帖子模型具有status_id属性,这意味着帖子应该belong_to :status而不是has_one :status。然后,状态应为has_one :posthas_many :posts

现在,针对您的问题:您可以通过将title委托给关联的status对象来实现此目的。 (提示:将这些对象视为对象 - 忘记它们背后的数据库!)以下是:

# Post model
delegate :title, to: :status, prefix: true

这将在幕后定义一个如下所示的方法:

# Post model
def status_title
  status.title
end

有关delegate的更多信息,请参阅the api docs