【问题标题】:Rails best practice for creating a model during the creation of a separate modelRails 在创建单独模型期间创建模型的最佳实践
【发布时间】:2011-12-07 16:27:07
【问题描述】:

所以,我有两个模型:UserGroup

User belongs_to :group

Group has_many :users

当创建一个新的User 时,我想检查一个已经创建的Group 并分配它们,或者根据用户提供的信息创建一个新的GroupGroup.find_or_create_by_name("Name") 似乎是一个很好的方法,但我的问题是它应该放在哪里?我猜在“胖模型,瘦控制器”之后,它应该在user.rb。如果它在模型中,那么在用户创建时传递用户提供的字符串的最佳方法是什么?我应该在user.rb 中设置一个方法,然后在users_controller.rb 中调用该方法吗?

我猜一个相关的问题:我知道我的架构应该反映

create_table "users" do |t|
  t.integer "group_id"

用于查询。 Rails 究竟是如何“自动”链接这些的?创建我的Group 模型时,我猜它需要有一个string:id 列,而Rails 只是将两者联系起来?

很抱歉我明显缺乏对关联的理解,但我正在努力不只是将一些笨拙的东西拼凑在一起,并希望确保我了解最好的解决方法。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 model associations


    【解决方案1】:

    首先,根据你写的,一个组可以有多个用户,但一个用户只能是一个组的一部分。

    通常,一个组可以有多个成员,一个用户可以是多个组的成员。为此,您需要创建一个关联模型,称为 membership

    所以,你的用户模型有:

    has_many :memberships
    has_many :groups, :through => :memberships
    

    你的组模型有:

    has_many :memberships
    has_many :members, :through => memberships
    

    该协会将有一个自己的表格,类似于:

    create_table "memberships" do |t|
        t.integer "group_id"
        t.integer "user_id"
        t.timestamps
    end
    
    add_index :memberships, :group_id
    add_index :memberships, :user_id
    

    为了回答您最初的问题,如果您必须在创建用户时创建一个组,而不管他是如何创建的,我会在用户模型中创建一个 Active Record 回调:

    after_create :create_group
    
    def create_group
       # whatever logic and create group
    end
    

    有关 Active Record 回调的更多信息,请参阅http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

    如果您正在创建的组与在表单(视图)中输入的信息相关,并且与用户没有直接关系,那么您必须在控制器中创建组。类似的东西:

    def create
       @group = Group.build(params[:group])
       @group.save!
       @user = User.build(params[:user])
       @user.group_id = @group.id
       @user.save!
    end
    

    或者,更清洁的方式:

    def create
       @group = Group.build(params[:group])
       @group.save!
       @user = @group.users.build(params[:user])
       @user.save!
    end
    

    【讨论】:

    • 是的,User 只能属于单个Group,因此Membership 关联模型的额外抽象是不必要的(尽管我什至没有考虑过,谢谢)。
    • 另外,只是为了确保我理解正确:在您在User#create 中创建Group 的示例中,不需要分配吗?即,我不需要像@user.group_id = @group.id这样的事情?
    • @oflannabhra 是的,你必须这样做。除非您执行 @group.users.build(params[:user]) 之类的操作。我用这两种情况更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    相关资源
    最近更新 更多