G'day全部.
在Rails应用程序中,我有2个模型:用户和点,具有habtm关系和连接表.在spot/show动作中,我可以创建一个表单,询问当前用户是否访问过当前点(复选框),然后单击"保存"以在连接表中创建记录.
这很好用(所以我知道我的模型和关系都很好)然而不是那么优雅.有没有办法做到这一点,而无需使用复选框和提交按钮?最好只用一个按钮?
我的研究表明rails button_to可能会这样做,但我找不到一个有效的例子.
非常感谢.
我有一个简单的模型:
class User < ActiveRecord::Base
has_and_belongs_to_many :roles
end
class Role < ActiveRecord::Base
has_and_belongs_to_many :users
end
Run Code Online (Sandbox Code Playgroud)
我创建了一个简单的连接表:
class CreateUsersRoles < ActiveRecord::Migration
def self.up
create_table :users_roles, :id => false do |t|
t.integer :user_id
t.integer :role_id
t.timestamps
end
end
def self.down
drop_table :users_roles
end
end
Run Code Online (Sandbox Code Playgroud)
迁移后,shema.rb正在关注:
create_table "roles", :force => true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "users", :force => true do |t|
t.string "login"
t.string "password"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "users_roles", :id => false, :force => …Run Code Online (Sandbox Code Playgroud) 所以我最近在两个模型(项目和用户)之间创建了一个HABTM关系.
之前,我在项目表中有一个user_id列 - 它就像一个外键.现在有一整个表可以做到这一点.
但是,如何引用具有特定user_id和project_id的项目?
例如,我曾经有一段我的观点看起来像这样:
<div class="field">
<%= f.label :project_id %><br />
<%= collection_select(:stage, :project_id, Project.where(:user_id => current_user), :id, :name) %>
<br />
</div>
Run Code Online (Sandbox Code Playgroud)
但是,我现在如何从数据库中提取相同的信息,而没有HABTM表的模型?新表称为"projects_users".
我的项目模型如下所示:
# == Schema Information
# Schema version: 20101125223049
#
# Table name: projects
#
# id :integer not null, primary key
# name :string(255)
# description :string(255)
# notified :boolean
# created_at :datetime
# updated_at :datetime
#
class Project < ActiveRecord::Base
has_and_belongs_to_many :users
has_many :stages, :dependent => :destroy
has_many :uploads
has_many :comments
#before_validation …Run Code Online (Sandbox Code Playgroud) 我有与HABTM关系的用户和专辑模型
class Album < ActiveRecord::Base
has_and_belongs_to_many :users
class User < ActiveRecord::Base
has_and_belongs_to_many(:albums)
Run Code Online (Sandbox Code Playgroud)
我想查找存储在数据库中但未与特定用户关联的所有相册.
到目前为止我的代码是这样的:
Album.all(:order => "albums.created_at DESC", :include => "users", :limit => limit, :conditions => ["users.id != ? AND users.id IS NOT NULL", current_user.id])
但由于某种原因,这是行不通的.它返回与current_user关联的专辑.
这里从控制台看一下这个输出.检查我首先获取的用户ID.然后我获取不应该有用户ID的专辑我然后找到一个列出的专辑并要求它返回相关用户其中一个相关用户是上面的那个并且不应该在那里.

任何人都可以帮助以上吗?
我一直在修补这个问题已有一段时间了,似乎无法弄明白这一点.它可能很简单,但是这里有:
我在'层压板'和'标准'之间有一个has_many:trough关系,加上模型'标准化'.
Standard.rb
class Standard < ActiveRecord::Base
attr_accessible :description, :name
has_many :standardizations
has_many :laminates, :through => :standardizations
end
Run Code Online (Sandbox Code Playgroud)
Standardization.rb
class Standardization < ActiveRecord::Base
attr_accessible :laminate_id, :standard_id
belongs_to :laminate
belongs_to :standard
end
Run Code Online (Sandbox Code Playgroud)
Laminate.rb
class Laminate < ActiveRecord::Base
attr_accessible :name, :standard_ids
has_many :standardizations
has_many :standards, :through => :standardizations
end
Run Code Online (Sandbox Code Playgroud)
情景是层压板可以属于几个标准,我已经在视图的新部分工作了 - 复选框和所有东西.我的问题是在尝试显示给定层压板的相应标准的名称时.截至目前,我能够显示层压板所分配的标准,但不仅仅是标准的名称.
我的show.html.erb说:
<%= @laminate.standards %>
Run Code Online (Sandbox Code Playgroud)
这会使一切正确,但是说
<%= @laminate.standards.name %>
Run Code Online (Sandbox Code Playgroud)
......不起作用.我怎样才能利用每个人的名字,分配标准?
Laminate_controller:
class LaminatesController < ApplicationController
# GET /laminates
# GET /laminates.json
def index
@laminates = Laminate.all
@standards = Standard.all
respond_to …Run Code Online (Sandbox Code Playgroud) ruby many-to-many views ruby-on-rails has-and-belongs-to-many
如何has_and_belongs_to_many在两个模型之间的表中添加多个记录?
到目前为止,我只能弄清楚如何创建一条记录,然后更新该记录.我想在连接表中添加多个记录.
现在我有一个collection_select,但更新方法只允许我更新记录,而不是添加新记录.
我最好的猜测是@group.workouts << workout_id在组控制器中添加类似于更新方法的东西,但我无法弄清楚如何让它工作.
我在这里走在正确的轨道上吗?
我正在尝试将训练添加到组和组进行训练.
谢谢您的帮助!
编辑1:
我有一个collection_select允许我添加单个记录到连接表,但我想弄清楚如何添加第二个,第三个等记录到连接表.我collection_select是:
<div class="field">
<%= f.collection_select 'workout_ids', Workout.all, :id, :name, { :include_blank => ""} %>
</div>
Run Code Online (Sandbox Code Playgroud)
所以简单地说,我想为一个小组添加锻炼,我可以这样做.然后我想为同一组添加另一个锻炼,然后是另一个,等等.
如果我有两个表,比如说,foos并且bars在多对多关系中(通过bars_foos连接表,在这种情况下),CakePHP 3.0中包含与每个Foo关联的Bars的ID数组的最佳方式是什么? RequestHandler通过_serialize属性返回的JSON?
具体来说,我希望能够访问site/foos.json并看到这样的事情:
{
"foos": [
{
"id": 1,
"name": "A foo",
...
"bar_ids": [1, 3, 5]
},
{
"id": 2,
"name": "Foo too",
...
"bar_ids": [2]
]
}
Run Code Online (Sandbox Code Playgroud)
作为奖励,如果每个Foo也属于ToMany Bazzes,这应该仍然有用,所以我最终得到了,例如,
...
"bar_ids": [1, 3, 5],
"baz_ids": [37, 42]
...
Run Code Online (Sandbox Code Playgroud)
是否有一种直接的方法来实现这一点,很容易应用于许多模型,并不会导致过多的数据库查询?
我已经设法以两种方式粗略地完成了这项工作,但是对于快速且容易地推广到许多模型而言似乎都不成熟.我担心添加新查询或查询字段以获取可能已经存在于CakePHP中的信息的效率,如果我只能找到正确的语法来实现它.
一种方法是通过Foo实体中的_getBarIds()函数和设置创建虚拟字段protected $_virtual = ['bar_ids'].该函数使用TableRegistry查找和查询bars_foos与当前Foo关联的Bar实体的连接表,并将它们作为PHP数组返回.关键功能大致如下:
// In src/Model/Entity/Foo.php, protected function _getBarIds:
$bars_foos = TableRegistry::get('Bookmarks_Tags');
$these_bars = $bars_foos->find()
->select(['bar_id'])
->where(['foo_id' => $this->id]);
Run Code Online (Sandbox Code Playgroud)
这样做效果相当不错,但是 …
命名空间中有两个模型,它们需要与has_and_belongs_to_many以多对多关系关联.它们是这样创建的:
$ rails generate model namespace/model_a name:string
# app/models/namespace/model_a.rb
class Namespace::ModelA < ActiveRecord::Base
end
Run Code Online (Sandbox Code Playgroud)
和
$ rails generate model namespace/model_b name:string
# app/models/namespace/model_b.rb
class Namespace::ModelB < ActiveRecord::Base
end
Run Code Online (Sandbox Code Playgroud)
我需要做什么才能成功建立多对多关系?
activerecord many-to-many namespaces has-and-belongs-to-many ruby-on-rails-4
用户.rb
class User < ActiveRecord::Base
has_and_belongs_to_many :user_groups
end
Run Code Online (Sandbox Code Playgroud)
同样,user_group.rb
class UserGroup < ActiveRecord::Base
has_and_belongs_to_many :users
end
Run Code Online (Sandbox Code Playgroud)
现在用户组的活动管理页面如下所示:
ActiveAdmin.register UserGroup, as: 'UserGroup' do
form do |f|
f.inputs do
f.has_many :usergroup_users, as: 'member user' do |user|
user.input :user_id
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
现在,这将创建用户组表单,其中包含用于将用户添加到新组的字段。将新用户添加到组的按钮将为Add new User Group User。我想将此按钮标签修改为其他内容。如何实施?
使用以下方法解决了我的部分问题:
f.has_many :usergroup_users, heading: 'Add User to Group', as: 'member user' do |user|
...
end
Run Code Online (Sandbox Code Playgroud)
这会将标题部分更改为所需的文本。但按钮标签仍然是一个问题。
ruby ruby-on-rails has-many has-and-belongs-to-many activeadmin
我有一个注册应用程序,它记录一个Participant模型,其中有两个悬挂模型 -Student_Detail和Volunteer_Detail. Participant has_one的Student_Detail和Volunteer_Detail。
还有第三种模式,Group. Group记录哪些参与者相互匹配。由于参与者可能涉及一个以上的Group和Group可能有不止一个Participant,我认为has_and_belongs_to_many是最佳组合Participant和Group。
一个连接表存在于Group和Participant
我是 Rails 的新手,我正在使用活动管理员来管理这个应用程序。
当我登录时,我可以看到我作为资源生成的每个模型,但我希望能够在查看Participant选项卡时显示每个参与者的相关详细信息(学生/志愿者/组)。目前,它仅显示仅适用于该特定模型的属性,而不显示任何关联模型的属性。
这是我的模型的 active_admin 资源代码Participant:
ActiveAdmin.register Participant do
permit_params :first_name, :last_name, :gender, :email, :birthdate, :phone,
:street_name, :city, :state, :zip, :role, student_details_attributes: [:nationality, :religion, :need_ride,
:has_spouse, :spouse_name, :english_level, :expectation, :length_of_stay, :exact_length, :volunteer_id,
:matched, :returned_home, :participant_id], volunteer_details_attributes: [:date, :importance, :story, …Run Code Online (Sandbox Code Playgroud) ruby-on-rails has-and-belongs-to-many activeadmin rails-activerecord
activeadmin ×2
activerecord ×2
many-to-many ×2
ruby ×2
cakephp ×1
cakephp-3.0 ×1
fixtures ×1
has-many ×1
namespaces ×1
views ×1