【问题标题】:Rails - data view from has_many and Has_many_and_belongs_to_manyRails - 来自 has_many 和 Has_many_and_belongs_to_many 的数据视图
【发布时间】:2011-06-17 18:39:40
【问题描述】:

我正在尝试实施这个项目:

http://img7.imagebanana.com/img/cnb46ti2/relationships.png

  • 我想在员工的展示页面上查看员工的技能
  • 一个员工有一个职位,每个职位都有这个职位的员工需要知道的技能
  • 因此,如果我理解正确,职位和技能具有 n:m 关系,并且它们需要一个连接表来实现 has_many_and_belongs_to_many 关系。因为一个职位包含很多技能,每个技能都属于很多职位。

现在我的问题

  1. position_skill-table -> 是使用 has_and_belongs_to_many 关系更好,所以这个表没有自己的 id 还是使用 has_many :through 关系更好?我想最好使用 has_and_belongs_to_many 关系,因为这个关系表除了两个键之外不会有任何进一步的信息。我说的对吗?
  2. 如果我采用 has_and_belongs_to_many - 关系,那是我唯一需要写入模型的内容吗?

a)class Position < ActiveRecord :: Base (...) has_and_belongs_to_many :skills (...)

b)class Skill < ActiveRecord :: Base (...) has_and_belongs_to_many :positions (...)

c) 进入 db\migrate def self.up create_table :positon_skill, :id => false do |t| (...) 在那之后,职位和技能是相互联系的?是对的吗?我是不是忘记了什么?

  • 如果是这样,我怎样才能让技能在员工的显示页面上查看?一个员工有1个职位,这个职位有几个技能......我需要在员工的show.html.erb中写入什么代码?像<%= employee.position.skill %> 这样的东西?我还需要渲染一些东西吗?对不起,我很困惑,我认为我在网络上阅读了太多信息......或者网络上是否有任何描述准确描述了我需要什么?

提前非常感谢,对于这个多余的问题,我们深表歉意。

【问题讨论】:

    标签: ruby-on-rails view relationships


    【解决方案1】:
    1. 如果您确定以后不想将任何信息添加到 position_skills 表中,has_and_belongs_to_many 可以正常工作。但是,如果您稍后改变主意,has_many :through 会更加灵活,而且设置起来也不是很困难。

    2. 如果使用has_and_belongs_to_many,则只需在模型和数据库表中使用position_id:integerskill_id:integer字段进行关联声明。好像你已经有了。

    为了能够在您的视图中访问employee.position.skills,您需要急切地加载员工的关联。尝试以下方法:

    class EmployeesController < ApplicationController
      ...
      def show
        @employee = Employee.find(params[:id], :include => { :position => :skills })
      end
      ...
    end
    

    如果你坚持使用has_and_belongs_to_many,我认为应该可以,但如果你选择has_many :through(我推荐),你需要使用:include =&gt; { :position =&gt; { :position_skills =&gt; :skills } }

    【讨论】:

    • @Luke:感谢您的详细回答!遗憾的是,它不适用于 has_and_belongs_to_many。这就是我在创建所有其他表及其关系后所做的 1. 我创建了 position_skills(使用 rails generate scaffold position_skill position_id:integer skill_id:integer) 2. 我将 :id =&gt; false 添加到 routes\create_position_skill 3. 我使用了命令 rake db:migrate 所以它没有t 创建 id 4. 我在 SQLite DatabaseBrowser 5 中填写了表 position_skill。然后我想尝试一下位置和技能是否真的相互关联
    • 所以我写到rails控制台first_skill = Skill.first(当然工作)和first_skill.positions发生了一个错误:ActiveRecord :: Statement Invalid: Could not find table positions_skills->虽然它已经迁移,但它似乎找不到表。但我想知道:为什么它搜索“positions_skills”而不是“position_skills”?
    • 关于has_and_belongs_to_many方法的另一个问题:我不需要在position_skills的模型中写任何东西?不像belongs_to :position belongs_to :skill
    • 如果你使用has_and_belongs_to_many,你不应该为positions_skills创建任何东西,除了数据库中的表。您可以运行rails destroy scaffold position_skill 来摆脱所有这些并重新创建迁移(使用正确的positions_skills 表名)。一切都在 Rails 中为has_and_belongs_to_many 关系在幕后处理,您只需为其提供正确的数据库表。这也应该回答你的第二个问题:没有模型。
    • 另外:您基本上已经为has_many :through 关联做了所有需要做的事情。如果你愿意,你可以重新声明它,而不是删除你所做的一切。
    【解决方案2】:

    这就是它在您的图表中的样子。考虑以下几点:

    class Employee < ActiveRecord :: Base
      belongs_to :position
      ...
    end
    
    class Position < ActiveRecord :: Base
      has_many :employees
      has_many :position_skills
      has_many :skills, :through => :position_skills
      ...
    end    
    
    class PositionSkill < ActiveRecord :: Base
      belongs_to :position
      belongs_to :skill
      ...
    end
    
    class Skill < ActiveRecord :: Base
      has_many :position_skills
      has_many :positions, :through => :position_skills
      ...
    end
    

    唯一的问题是员工被绑定到一个职位。而这个职位通过职位有很多技能。我会将其更改为职位belongs_to 员工和员工has_many 职位。这使得它可以跟踪从一个职位转移到下一个职位的员工。如果您需要更多信息,请告诉我。

    【讨论】:

    • 太棒了,效果很好!我还将代码添加到员工控制器中。在一个有趣的案例中,用于 has_and_belongs_to_many :include =&gt; { :position =&gt; :skills } 的代码有效,而为 has_many :through - Method :through :include =&gt; { :position =&gt; { :position_skills =&gt; :skills } } 建议的代码首先给了我一个错误:ActiveRecord::ConfigurationError --- Association named 'skills' was not found; perhaps you misspelled it?,但我将 :skills 更改为 :skill,现在它可以工作了。
    • 但现在对于这种情况还有一个进一步的问题:在我使用&lt;%= @employee.position.skills %&gt; [link]img7.imagebanana.com/img/p2rjbbev/viewskills.PNG 之后,我的视图现在看起来像这样技能 2'、'技能 4' 而不是所有这些无用的信息。我是否需要另一个命令而不是 &lt;%= @employee.position.skills %&gt; 才能获得此结果?像@employee.position.skills :select =&gt; category??我真的没有主意!
    猜你喜欢
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多