不确定如何正确设置此关系。 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但不知道如何执行此操作。
非常感谢任何帮助。
答案 0 :(得分:0)
首先,由于您的帖子模型具有status_id
属性,这意味着帖子应该belong_to :status
而不是has_one :status
。然后,状态应为has_one :post
或has_many :posts
。
现在,针对您的问题:您可以通过将title
委托给关联的status
对象来实现此目的。 (提示:将这些对象视为对象 - 忘记它们背后的数据库!)以下是:
# Post model
delegate :title, to: :status, prefix: true
这将在幕后定义一个如下所示的方法:
# Post model
def status_title
status.title
end
有关delegate
的更多信息,请参阅the api docs。