【问题标题】:How to setup this relationship and display the correct data如何设置这种关系并显示正确的数据
【发布时间】:2014-05-20 02:21:51
【问题描述】:

不确定如何正确设置这种关系。 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,但不知道该怎么做。

非常感谢任何帮助。

【问题讨论】:

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


    【解决方案1】:

    首先,由于您的 Post 模型具有 status_id 属性,这意味着 Post 应该是 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

    【讨论】:

    • 感谢您的信息,但我有点困惑。如果 Post belongs_to 状态,那么 Post 将有 2 个 belongs_to 关系——这样可以吗?我对模型进行了调整,只是不确定是否允许这样做。我添加了该行(并尝试了一些不同的变体),但不确定如何使其正确显示。当我尝试输出 Post.status_title 时,我收到“status_title”的未定义方法错误我也尝试不使用前缀并将 status_title 定义为 status.stats_title(它如何存储在数据库中)并且它不起作用。
    • @James,是的,在模型中拥有 2 个(或更多)belongs_to 关联非常好。这是一个设计问题,Rails 不会妨碍您。你真的打电话给Post.status_title吗?因为status_title 不是类方法——您需要在Post 类的实例上调用该方法。所以试试Post.first.status_title。或者,如果这不起作用,至少要确保 Post 实例仍然可以返回它关联的 status 对象。如果可以,那么委托人应该可以解决问题!
    猜你喜欢
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多